Django2.0-db(4)-Field常用参数,Meta设置,外键

Field常用参数

null
  • 默认为False。如果设置为TrueDjangoi会在映射表的时候指定是否为空。
  • 在使用字符串相关的Field(比如CharFieldTextField),官方推荐不要使用该参数,即默认False
  • Django在处理字符串相关的Field,即使这个Fieldnull= False,如果你没有给这个Field传递任何值,Django也会使用一个空的字符串""来作为默认值存储进去。
    • 如果此时再使用null=TrueDjango就会产生两种空值的情形(NULL或者空字符串)。
    • 如果想要在表单验证的时候允许这个字符串为空,那么建议使用blank=True
    • 如果你的FieldBooleanField,则对应的可空字段为NullBooleanfield

blank
  • 标识这个字段在表单验证的时候是否可以为空。 默认False
  • null的区别
    • null是纯数据库级别
    • blank是表单验证级别

db_column
  • 字段在数据库中的名字。如果没有设置这个属性,那么将会使用模型中属性的名字

default
  • 默认值。可以为一个值或者一个函数(不是函数调用!)。但是不支持lambda表达式。并且不支持列表/字典/集合等可变的数据结构

primary_key
  • 是否为主键。默认是False

unique
  • 在表中这个字段的值是否唯一。一般是设置手机号码/邮箱等。

模型的Meta设置

  • 对于模型级别的配置。可以在模型中定义一个类,叫做Meta。然后再这里类中添加一些类属性来控制模型的作用。
db_table
  • 这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型名来作为默认的表名。

ordering
  • 设置在提取数据的排列方式。

    class Book(models.MODEL):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=100)
        
        def __str__(self):
            return "<Book:id:'%s' name:'%s'>" % (id, name)
        
        class Meta:
            db_table = "book_table"  # 映射到数据的表名就是book_table
            ordering = ['-id']  # 列表 形式,-号表示倒序
    

外键

  • MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在Django中的使用。

  • 类定义为class ForeignKey(to,on_delete,**options)。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理。

  • 这里以一个实际案例来说明。比如有一个User和一个Article两个模型。一个User可以发表多篇文章,一个Article只能有一个Author,并且通过外键进行引用。那么相关的示例代码如下:

    class User(models.Model):
        username = models.CharField(max_length=20)
        password = models.CharField(max_length=100)
    
    
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
    
        author = models.ForeignKey("User",on_delete=models.CASCADE)
    
  • 以上使用ForeignKey来定义模型之间的关系。即在article的实例中可以通过author属性来操作对应的User模型。示例代码如下:

    article = Article(title='abc',content='123')
    author = User(username='张三',password='111111')
    article.author = author
    article.save()
    
    # 修改article.author上的值
    article.author.username = '李四'
    article.save()
    
  • 为什么使用了ForeignKey后,就能通过author访问到对应的user对象呢。因此在底层,DjangoArticle表添加了一个属性名_id的字段(比如author的字段名称是author_id),这个字段是一个外键,记录着对应的作者的主键。以后通过article.author访问的时候,实际上是先通过author_id找到对应的数据,然后再提取User表中的这条数据,形成一个模型。

  • 如果想要引用另外一个app的模型,那么应该在传递to参数的时候,使用app.model_name进行指定。以上例为例,如果UserArticle不是在同一个app中,User在appuser中,那么在引用的就应该这样写:

    # User模型在user这个app中
    class User(models.Model):
        username = models.CharField(max_length=20)
        password = models.CharField(max_length=100)
    
    # Article模型在article这个app中
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
    
        author = models.ForeignKey("user.User",on_delete=models.CASCADE)
    
  • 如果模型的外键引用的是本身自己这个模型,那么to参数可以为'self',或者是这个模型的名字。在论坛开发中,一般评论都可以进行二级评论,即可以针对另外一个评论进行评论,那么在定义模型的时候就需要使用外键来引用自身。示例代码如下:

    class Comment(models.Model):
        content = models.TextField()
        origin_comment = models.ForeignKey('self',on_delete=models.CASCADE,null=True)
        # 或者
        # origin_comment = models.ForeignKey('Comment',on_delete=models.CASCADE,null=True)
    
外键删除操作

如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下:

  1. CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
  2. PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
  3. SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
  4. SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。
  5. SET():如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。
  6. DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。

以上这些选项只是Django级别的,数据级别依旧是RESTRICT!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值