Django——model基础
<div id="cnblogs_post_body"> ORM映射关系: 表名 <-------> 类名 创建表(建立模型)实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄。 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email。 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many)。 模型建立如下: 通过logging可以查看翻译成的sql语句 ![]() LOGGING =: 1::: [:
注意事项: 1、 表的名称 2、 3、对于外键字段,Django 会在字段名上添加来创建数据库中的列名 4、这个例子中的 5、定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加
每个字段有一些特有的参数,例如,CharField需要参数来指定 ![]() (1如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.
( 1<span style="color: #000000;">)blank如果为True,该字段允许不填。默认为False。 (2<span style="color: #000000;">)default 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。 (3<span style="color: #000000;">)primary_key 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=<span style="color: #000000;">True, (4<span style="color: #000000;">)unique 如果该值设置为 True,这个数据字段的值在整张表中必须是唯一的 (5<span style="color: #000000;">)choices 这是一个关于 choices 列表的例子: YEAR_IN_SCHOOL_CHOICES =<span style="color: #000000;"> ( <span style="color: #0000ff;">from django.db <span style="color: #0000ff;">import<span style="color: #000000;"> models <span style="color: #0000ff;">class<span style="color: #000000;"> Person(models.Model): >>> p = Person(name=<span style="color: #800000;">"<span style="color: #800000;">Fred Flintstone<span style="color: #800000;">",shirt_size=<span style="color: #800000;">"<span style="color: #800000;">L<span style="color: #800000;">"<span style="color: #000000;">)
的操作。
|
外键字段
关键点:
在更新多对多的第三张表时,可以直接用以下方法
book_obj.authors.set(*[装有对象id的列表])
此操作包含了两步clear+add
有时候字段获取的较多,但是需要更新的表里没有那么多字段,此时需要删除一些字段,但是我们又需要用到这些字段的值时,可以用pop,即达到了删除的效果,也可以拿到对应的删除对象,保存下来进行其他操作
关键点:是什么?
解除关系:
是的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
子句中添加另一个参数。
分组:annotate()
为中每一个对象都生成一个独立的统计值(统计方法用聚合函数)。
(1) 练习:统计每一本书的作者个数

解析:
(2) 如果想对所查询对象的关联对象进行聚合:
annotate的返回值是querySet,如果不想遍历对象,可以用上valuelist:
方式2:
(6) 查询各个作者出的书的总价格:
.annotate(SumPrice=Sum())
.values_list(,<span style="color: #008000;">#<span style="color: #008000;">按authorsname group by
queryResult2=Book.objects.values(<span style="color: #800000;">"<span style="color: #800000;">authorsname<span style="color: #800000;">")
.annotate(SumPrice=Sum(<span style="color: #800000;">"<span style="color: #800000;">price<span style="color: #800000;">"))
.values_list(<span style="color: #800000;">"<span style="color: #800000;">authors__name<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">SumPrice<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">print(queryResult2)
1.查询人民邮电出版社出了多少本书
2.查询陈吉出的书总价是多少
3.查询各个作者出的书的总价格是多少
4.查询各个出版社最便宜的书价是多少
1.annotate(*args,**kwargs):可以为QuerySet中的每个对象添加注解。可以通过计算查询结果中的每个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和,等等)。
用于
2.aggregate(*args,**kwargs):通过对QuerySet进行计算,返回一个聚合值的字典,aggregate()中每个参数都可以指定一个包含在字典中的返回值。
用于
所在位置:django.db.models
1.Avg:返回所给字段的平均值
2.Count:根据所给关联字段返回被关联model的数量。
3.Max:返回所给字段的最大值
4.Min:返回所给字段的最小值
5.Sum:计算所给字段值的总和
F查询与Q查询
F查询
在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?
Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。
修改操作也可以使用F函数,比如将每一本书的价格提高30元:
Q查询
等方法中的关键字参数查询都是一起进行“AND” 的。语句),你可以使用。
对象可以使用和操作符组合起来。对象上使用时,它产生一个新的对象。
等同于下面的SQL子句:
和操作符以及使用括号进行分组来编写任意复杂的对象。对象可以使用操作符取反,这允许组合正常的查询和取反() 查询:
和关键字参数。对象)都将"AND”在一起。对象,它必须位于所有关键字参数的前面。
修改表记录
注意:
<1> 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter里面的条件可能有多个条件符合,比如name='alvin',可能有两个name='alvin'的行数据)。
<2>
此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
注意,这里因为update返回的是一个整形,所以没法用query属性;对于每次创建一个对象,想显示对应的raw sql,需要在settings加上日志记录部分
删除表记录
删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:
你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。
例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:
要牢记这一点:无论在什么情况下,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,而并不是分别删除每个对象。如果你想使用在 model 中自定义的 delete() 方法,就要自行调用每个对象的delete 方法。(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。
在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:
要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!