阿布云

你所需要的,不仅仅是一个好用的代理。

Django的模型和数据库以及一点总结(一)

阿布云 发表于

527.png

模型和数据库

模型

首先我们在创建一个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时,??