模型和数据库
模型
首先我们在创建一个model的时候,这个类都是继承自 django.db.models.Model,
各种Model Field类型
- AutoField,自动增长的IntegerField,如果不指定,则默认添加。
- IntegerField/BigIntegerField/PositiveSmallIntegerField/SmallIntegerField:都是类似的,只是数字的范围不同。
- BinaryField/DecimalField:二进制和十进制。
- BooleanField,如果没有指定default的话,默认为None
- CharField,**必须**接收另外一个参数 max_length
- DateField,使用Python的 datetime.date 实例表示的日期。
需要注意的是,auto_now用于每次保存对象的时候,自动设置该字段为当前时间;auto_now_add则用于第一次被创建时自动设置该字段为当前时间,这些选项还有default之间相互违背的,所以不要同时使用任意多个。这些选项默认保存的是 django.utils.timezone.datetime 里面的now,所以如果想要进行特殊的保存,需要自己重写save函数。
- EmailField,基于CharField,使用EmailValidator来验证输入和合法性。
- FileField,上传文件,字段的选项不支持primary_key和unique。
需要在settting文件里面,需要添加MEDIA_ROOT用来提供文件上传的根路径,而参数upload则提供文件具体的位置。
当你删除了该model,文件需要你自己手动去删除。
- ImageField,继承自FileField,同时还添加了图像的验证。
- NullBooleanField,和之前BooleanField不同的是,它除了允许True或者False,还允许Null=True,也就是为null。
- TextField,适用于大文本字段,如果设定了max_length属性,那么其只会对组件进行一个内容显示的限制,但是不会对数据库存在限制。
- TimeField,和Python中的datetime.time一样,参数则和DateField相同。
- URLField,继承自CharField,但是同样添加了URL的验证。
除了上面的Fields,还有关系Field:
- ForeignKey,对应的是一对多的关系,可以指定关联删除-**on_delete=models.CASCADE**,如果要关联的对象还没有定义好,可以使用其名字。
- limit_choices_to,可以限制关联返回的内容。
- related_name,可以让关联的对象反查到源对象,如果不想创建反向关联,则设置为"+"即可。需要注意的是,如果没有使用该Field,那么想要使用反向关联,则需要**foo_set**,foo为关联对象的小写名称,如果使用了该Field,则可以直接使用自己定义的名称。
- related_query_name,和上面的作用类似,同样可以反向查询,两者只需要设置一个即可。
- to_field,指定关联对象的字段名称,默认情况下为对方的主键。
- db_constraint,控制是否在数据库中为这个外键创建约束,默认为True。
- on_delete,可以实现CASCADE,级联删除;PROTECT,防止被引用对象删除,抛出ProtectedError;SET_NULL,将其设置成null;
SET_DEFAULT,设置成默认值;SET,可以传递值,同时还可以传递可调用对象;DO_NOTHING,不采取任何动作。
- ManyToManyField,对应的是多对多的关系。
- symmetrical,只用在自己对自己进行关联的时候。比如说Friend,你的朋友是我,我的朋友是你。
- through,如果不想要Django自动创建的多对多的关系表,可以通过指定through指定自己定义的中介表。
- through_fields,在上面的基础上指定中间模型的**哪些字段**来建立是多对多关联。
- db_table,设定多对多关系表的名称。
- db_constraint,同上。
- swappable,
- OneToOneField,对应的是一对一的关系,其可以直接返回关系另一边的对象,最主要的用途是作为扩展自另外一个模型的主键。比如多表继承就是利用这样的原理,通过对子模型添加一个隐式的一对一关联关系到父亲模型实现的。
如果你没有指定其的related_name参数,那么Django将使用当前模型的小写名称作为默认值。
如果访问相应的对象不存在的话,则会抛出ObjectDoesNotExist的异常。
当设置**parent_link**为True时,??