<div id="cnblogs_post_body">
<div style="text-align: right;">
<div id="cnblogs_post_body">
<div style="text-align: right;">
映射关系:
表名 <-------> 类名字段 <-------> <a href="/tag/shuxing/" target="_blank" class="keywords">属性</a>
表记录 <------->类实例对象
实例:我们来假定下面这些概念,字段和关系
作者模型:一个作者有姓名和年龄。
作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one)
出版商模型:出版商有名称,所在城市以及email。
书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many)。
模型建立如下:
通过logging可以查看翻译成的sql语句
注意事项:
1、 表的名称myapp_modelName
,是根据 模型中的元数据自动生成的,也可以覆写为别的名称
2、id
字段是自动添加的
3、对于外键字段,Django 会在字段名上添加来创建数据库中的列名
4、这个例子中的CREATE TABLE
sql 语句使用Postgresql 语法格式,要注意的是Django 会根据settings中指定的数据库类型来使用相应的sql 语句。
5、定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py
所在应用的名称。
每个字段有一些特有的参数,例如,CharField需要参数来指定VARCHAR
数据库字段的大小。还有一些适用于所有字段的通用参数。这些参数在文档中有详细定义,这里我们只简单介绍一些最常用的:
(
1<span style="color: #000000;">)blank如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=<span style="color: #000000;">False,该字段就是必填的。
(2<span style="color: #000000;">)default
字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
(3<span style="color: #000000;">)primary_key
如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=<span style="color: #000000;">True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=<span style="color: #000000;">True。
(4<span style="color: #000000;">)unique
如果该值设置为 True,这个数据字段的值在整张表中必须是唯一的
(5<span style="color: #000000;">)choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。
这是一个关于 choices 列表的例子:
YEAR_IN_SCHOOL_CHOICES =<span style="color: #000000;"> (
(<span style="color: #800000;">'<span style="color: #800000;">FR<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Freshman<span style="color: #800000;">'<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">SO<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Sophomore<span style="color: #800000;">'<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">JR<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Junior<span style="color: #800000;">'<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">SR<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Senior<span style="color: #800000;">'<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">GR<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Graduate<span style="color: #800000;">'<span style="color: #000000;">),)
每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。 在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如:
<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):
SHIRT_SIZES =<span style="color: #000000;"> (
(<span style="color: #800000;">'<span style="color: #800000;">S<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Small<span style="color: #800000;">'<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">M<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Medium<span style="color: #800000;">'<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">L<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">Large<span style="color: #800000;">'<span style="color: #000000;">),)
name = models.CharField(max_length=60<span style="color: #000000;">)
shirt_size = models.CharField(max_length=1,choices=<span style="color: #000000;">SHIRT_SIZES)
>>> 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;">)
>>><span style="color: #000000;"> p.save()
>>><span style="color: #000000;"> p.shirt_size
<span style="color: #800000;">'<span style="color: #800000;">L<span style="color: #800000;">'
<span style="color: #000000;"> p.get_shirt_size_display()
<span style="color: #800000;">'<span style="color: #800000;">Large<span style="color: #800000;">'
的操作。
关键点:
在更新多对多的第三张表时,可以直接用以下方法
book_obj.authors.set(*[装有对象id的列表])
此操作包含了两步clear+add
有时候字段获取的较多,但是需要更新的表里没有那么多字段,此时需要删除一些字段,但是我们又需要用到这些字段的值时,可以用pop,即达到了删除的效果,也可以拿到对应的删除对象,保存下来进行其他操作
关键点:是什么?
解除关系:
Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。
修改操作也可以使用F函数,比如将每一本书的价格提高30元:
等方法中的关键字参数查询都是一起进行“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() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用: