Django Model层的深入理解

Django Model层的深入理解

一、字段

model中的每个类对应了数据库中的一张表,每个类的私有变量,对应数据库表中的字段。我们可以通过更改变量的一些设置来更改每个字段的类型、选项等信息。如:username = model.CharField(max_length=32) 表示 username的数据类型是varchar, 最大长度为32,不作为主键,未设置默认值,数据备注为’username’等。后面的信息虽然我们没有进行设置,但是Django已经为其准备了默认的属性。

常用的字段类型: CharField, TextField, IntegerField, DateField等
常用的字段选项:

  1. null(如果True,字段为空时,值为NULL)

  2. blank(如果为True, 表示允许空值, 与null不同在,blank是在表单提交的时候进行验证的)

  3. default(设置默认取值)

  4. max_length(最大长度)

  5. choices (该参数接收一个可迭代的列表或元组(基本单位为二元组)。如果指定了该参数,在实例化该模型时,该字段只能取选项列表中的值。)

    一个选项列表:

    YEAR_IN_SCHOOL_CHOICES = (
        ('FR', 'Freshman'),
        ('SO', 'Sophomore'),
        ('JR', 'Junior'),
        ('SR', 'Senior'),
        ('GR', 'Graduate'),
    )
    

    每个二元组的第一个值会储存在数据库中,而第二个值将只会用于显示作用。

  6. primary_key (为True, 设为主键,是否设为主键)

  7. Unique (为True,不能重复,取值能否重复)

二、主键

Django默认会添加一个名为id的自增字段作为数据表的主键(相当于 id = model.AutoField(primary=True) ), 但同时也支持自己定义其他的字段作为主键,参考上面代码的写法即可。所以,可以看出来建立表时必然是存在有主键的。

三、关联关系

即多对多、多对一、一对一三种关联关系。

  1. 多对一 (Many-to-one)
    直接指定ForeignKey。如:

    class Manufacturer(models.Model):
    # ...
    pass
    
    class Car(models.Model):
        manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
    
  2. 多对多 (many-to-many)
    与多对一的写法是一样的:

    from django.db import models
    
    class Topping(models.Model):
        # ...
        pass
    
    class Pizza(models.Model):
        # ...
        toppings = models.ManyToManyField(Topping)
    

    但是需要注意的是,多对多关系中,ManyToManyField只能出现一次,可以出现在相关联的两个表的任意表。

    另外,允许设置额外字段(使用through参数来设置):

    class Person(models.Model):
        name = models.CharField(max_length=128)
    
        def __str__(self):
            return self.name
    
    class Group(models.Model):
        name = models.CharField(max_length=128)
        members = models.ManyToManyField(Person, through='Membership')
    
        def __str__(self):
            return self.name
    
    class Membership(models.Model):
        person = models.ForeignKey(Person, on_delete=models.CASCADE)
        group = models.ForeignKey(Group, on_delete=models.CASCADE)
        date_joined = models.DateField()
        invite_reason = models.CharField(max_length=64)
    
  3. 一对一(one-to-one)
    与上述两种的配置是基本相同的,官文里也没有例子,这里也不写了,如果工程中实际用到再加吧。

其他的点

  1. 特殊字段名 主要是不可以与关键字,Django提供的api的命名相冲突
  2. 跨文件模型 如zip文件
  3. 支持定义函数 如已知birthday可以通过计算得出用户的年龄,知道FirstName和FamilyName可以得到用户的FullName等,通过定义函数就可以实现这些功能。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值