<div id="cnblogs_post_body">
<div style="text-align: right;">
<div id="cnblogs_post_body">
<div style="text-align: right;">
映射关系:
表名 <-------> 类名字段 <-------> 属性
表记录 <------->类实例对象
实例:我们来假定下面这些概念,字段和关系
作者模型:一个作者有姓名和年龄。
作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(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,即达到了删除的效果,也可以拿到对应的删除对象,保存下来进行其他操作
关键点:是什么?
解除关系: