Django:模型的使用

  • 使用manage.py创建和更新数据库

  • 查询语法的介绍(Manager和QuerySet)


一,使用manage.py创建和更新数据库

1,syncdb命令

    python manage.py syncdb



syncdb是最常用的命令,它是保证所有模型在数据库中都有对应的表,而不是对这个数据库进行一次更新。在必要时候,syncdb会根据模型创建新的表,但对于以及存在的表,该命令不会去进行更改。

2,manage.py参数列表


manage.py函数

描述

syncdb

创建所有应用所需的数据表

sql

显示CREATETABLE调用

sqlall

如同上面的sql一样,从sql文件中初始化数据载入语句

sqlindexs

显示对主键创建索引的调用

sqlclear

显示DROP TABLE的调用

sqlcustom

显示指定.sql文件里的自定义SQL语句

loaddata

载入初始数据

dumpdata

把原有的数据库里的数据输出伟JSONXML等格式


sql、sqlall、sql、sqlindexs、sqlclear、sqlcustom不更新数据库,只打印SQL语句以作检验之用。


二,查询语法

查询由模式生成的数据库需要使用两个类:Manager和QuerySet。

1,Manager对象附在模型类里,如果没有特指定,每个模型类都会有一个objects属性,它构成了这个模型在数据库所有基本查询。

Manager的几个常用方法:

  • all:返回一个包含模式里所有数据库记录的QuerySet;

  • filter:返回一个包含符合指定条件的模型记录的QuerySet;

  • exclude:和filter相反,查找不符合条件的那些记录。

  • get:获取单个符合条件的记录(没有找到或者又超过一个结果都会抛出异常)


2,将QuerySet作为数据库查询

    QuerySet接受动态的关键字参数,然后转换称合适的SQL语句在数据库上执行。

例子:

from myproject.myapp.models import Book
books_about_trees = Book.objects.filter(title__contains=”Tree”)



解释:Book.objects.filter是一个Manger方法,它返回QuerySet对象;

title__contains=”Tree”是标题包含“Tree”。(gt:大于; gte:大于等于; in:成员测试)

所以这里要求Book的默认manager返回所有标题里含有“Tree”的书,并把返回结果QuerySet存放在一个变量里。这里的QuerySet代表的SQL查询如下:

SELECT * FROM myapp_book WHERE title LIKE “%Tree%”;



3,组合QuerySet查询

列子:

from myproject.myapp.models import Person
doe_family = Person.objects.filter(last=”Doe”)
john_does = doe_family.filter(first=”John”)
john_quincy_does=john_does.filter(middle=”Quincy”)


分析:上面的语句是一步一步缩小结果,开始过滤所有Person对象last name 为“Doe”的人,返回一个包含“Doe”的QuerySet对象赋给doe_family,然后在doe_family中过滤出first name 为“John”的对象,并赋值给john_does,最后在john_does过滤出middle name为Quincy的对象。

也可以直接写成:

Person.objects.filter(last=”Doe”).filter(first=”John”).filter(middle=”Quincy”)



4,查询结果排序

(1)order_by():改变QuerySet默认的排序

    例子:

    from myproject.myapp.models import Person
    all_sorted_first = Person.objects.all().order_by('first')


分析:返回的数据集按first name(名字) 排序。


all_sorted_first_five = Person.objects.order_by('first')[:5]

分析:返回按名字查找的前五个人

(2)倒序:在指定的字符串前加“-”就能实现倒序排列。

例如:order_by('-last')


5,用Q和~Q组合查询关键字

QuerySet可以通过一个叫Q的关键字参数封装类进一步参数化,允许使用更复杂的逻辑查询。其结果Q对象可以作为filter或exclude方法的关键字参数。

例子:

from myproject.myapp.models import Person
from django.db.models import Q
specific_does = Person.objects.filter(last=”Doe”).exclude(
Q(first=”John”) | Q(middle = “Quincy”)
)


    

~Q的例子:

Person.objects.filter(Q(last= “Doe”) | (Q(last=”Smith”)&Q(first=”John”)&~Q(middle_startwith=”W'))
)


说明:获取所有姓Doe,名伟John Smith,但不是叫John W.Smith的人。


6,使用Extra调整SQL

用extra可以修复QuerySet生成的原始SQL的各个部分,它接受四个关键字参数。如下:

extra参数 描述
select
修改select语句
where
提供额外的where子句
tables
提供额外的表
params
安全的替换动态参数

eg:

#select first,last,age(age>18) As is_adult FROM myapp_person;
the_folks = Person.objects.all().extra(select={'is_adult':”age>18”})

for person in the_folks:
if person.is_adult:
print “%s %s is an adult because they are %d year old.” % (persion.first,person.last,person.age)


三,利用Django没有提供的SQL特性

1,定义模式(schema)和定制inital SQL

(1)inital SQL:当运行manage.py和SQL相关命令时候,在应用程序里的sql子目录并以.sql结尾 的文件会被自动执行。所以通过使用initial SQL,可以把模式定义命令存放在Django项目里,并当使 用Django工具创建或者重新创建数据库的,它们一定能够会被包括进来。

下面这些功能可以通过这个特性来完成:

  • 视图

  • 触发器和级联

  • 自定义函数和数据类型


(2)fixtures:载入和导出数据

fixtures是保存在纯文本文件里面数据库数据集合的名字,通常指的不是原始的SQL dump,而是一种数据库无关的表现形式,例如XML,YAML,或者是JSON。

fixtures最常见的用法是数据库新建的时或重建的时候,作为初始数据加载进来,例如用来给用户输入的数据分类用的“预装”的数据表,或在开发期间载入的测试数据。



你可能感兴趣的:(python,django,orm,模型)