django之model操作初级篇

1、django中数据库引擎是在settings.py文件中配置:

  

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
  • ENGINE告诉django使用那个数据库引擎。本例中使用SQLite,默认数据库引擎
  • NAME告诉django数据的名称。

2、项目和应用之间的区别:一个是配置,一个是代码

  • 一个项目是一系列Django应用的实例,外加那些应用的配置。严格来说一个项目唯一需要的是一个设定文件,定义数据库连接信息、安装的应用列表、DIRS,等等。
  • 一个应用是一系列边写的django功能,通常包含模型和视图。打包在一个python包里面。django自带了一些应用,例如管理后台。这些应用的determined指出是便携,可以在多个项目中复用。

3、python代替SQL定义数据模型的原因:

  • 内省(introspection)有开销,而且不完美。为了提供便利的数据访问(api),Django需要已某种方式知晓数据库布局,而这一需求有两种实现方式。第一种是使用Python明确描述数据,第二种是在运行是内省数据库,推知数据模型。第二种方式在一个地方存储表的元数据,看似更简单,其实会导致几个问题。首先运行是内兴建数据库肯定有消耗。如果每次执行请求,或者只是初始化Webn服务器都要内省数据库,那带来的消耗是无法接受的。其次,有些数据库,尤其是旧版MySQL,存储的元数据不足以完成内省。
  • Python编写起来让人心情舒畅,而且使用Python编写所有代码无需频繁让大脑切换情景。在一个编程环境(思维)中待久了,有助于提高效率。在SQL和Python之间换来换去容易打断状态。
  • 把数据模型保存在代码中比保存在数据库中易于做版本控制,易于跟踪数据布局的变化。
  • SQL对数据布局的元数据只有部分支持。例如,多数数据库系统没有提供专门表示电子邮件地址或URL的数据类型。而Django模型有。高层及的数据结构有助于提升效率,让代码更便于福复用。
  • 不同数据库平台使用的SQL不一致。
  • 缺点:模型的Python代码可能与数据库的真正结构脱节。

4、创建图书模型:

from django.db import models


class Publisher(models.Model):
    name = models.CharField(max_length=32)
    address = models.CharField(max_length=64)
    city = models.CharField(max_length=64)
    state_province = models.CharField(max_length=32)
    country = models.CharField(max_length=64)
    website = models.URLField()

    def __str__(self):
        return self.name


class Author(models.Model):
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return '%s %s' % (self.first_name,self.last_name)


class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey('Publisher',to_field='id')
    publication_date = models.DateField()

    def __str__(self):
        return self.title

 添加数据:Publisher.objects.create(name="O'Reilly",address='10 Fawcett St.',city='Cambridge',state_province='MA',country='U.S.A',website='http://www.oreilly.com')

 获取全部数据:Publisher.objects.all()

  objects属性,叫管理器(manager)。管理器负责所有“表层”数据操作,包括(最重要的)数据查询。所有模型都自动获得一个objects管理器,需要查询模型实例时都要使用它。

  all方法,是objects管理器的一个方法,返回数据库中的所有行。返回的是一个QuerySet。

   获取特定数据:Publisher.objects.filter(id='xxx')

  filter过滤数据,返回的也是一个QuerySet对象

  检索单个对象:Publisher.objects.get(name='Apress')  返回的只是一个对象。

  排序数据,使用order_by()方法:Publisher.objects.order_by('name'),可以多个参数排序;倒序在字段名前面加上“-”(减号):Publisher.objects.order_by('-name').

  虽然order_by()有一定的灵活性,但是每次都调用它相当频繁。多数时候,我们时钟使用一个字段排序。可以在模型中指定默认排序:

class Publisher(models.Model):
    name = models.CharField(max_length=32)
    address = models.CharField(max_length=64)
    city = models.CharField(max_length=64)
    state_province = models.CharField(max_length=32)
    country = models.CharField(max_length=64)
    website = models.URLField()

    def __str__(self):
        return self.name
    
    class Meta:
        ordering=['name']

  这里出现了一个新概念,内嵌在Publisher类定义体中的class Meta。任何模型都可以使用Meta类指定多个针对所在模型的选项。

  链式查找:Publisher.objects.filter(country="U.S.A.").order_by("-name")

  切片数据:Publisher.objects.order_by('name')[0]

  数据更新:

  

第一种方法:
    p = Publisher.objects.get(name='Apress')
    p.name = 'Apress Publishing'
    p.save()
第二种方法:
    Publisher.objects.filter(id=52).update(name='Apress Publishing')

  删除数据:

第一种方法:
    p = Publisher.objects.get(name="O'Reilly")
    p.delete()
第二种方法:
    Publisher.objects.filter(country='USA').delete()
    Publisher.objects.all().delete()

 

posted @ 2018-01-23 11:33  Jerry-lin  阅读(145)  评论(0编辑  收藏  举报