• Django笔记&教程 4-3 模型(models)主键外键


    Django 自学笔记兼学习教程第4章第3节——模型(models)主键外键
    点击查看教程总目录

    参考:https://docs.djangoproject.com/en/2.2/ref/models/fields/

    1 主键

    梳理自官方文档:automatic-primary-key-fields

    不设置主键的情况下,Django会自动为每个模型提供以下字段:

    id = models.AutoField(primary_key=True)
    

    这是个自增(auto-incrementing)主键
    如果你在其他字段上设置了primary_key=True, 那么Django就不会自动给该模型添加上面的id主键了。
    每个模型都需要一个字段primary_key=True(显式声明或自动添加)。

    2 “复合主键”

    与其说这里设置的是“复合主键”,不如说是唯一约束,因为

    1. 设置了“复合主键”,该模型仍然会生成1中的自增id,以其作为主键
    2. 设置的方法和设置约束的方法是一样的。

    这里先给出一个“复合主键”代码例子,
    学生以年级号、年级子学号为复合主键(唯一约束)

    class Student(models.Model):
    
        grade = models.CharField(max_length=4, verbose_name="年级")
        number = models.CharField(max_length=6, verbose_name="年级子学号")
        # other attritudes ...
    
        class Meta:
            constraints = [
                # 复合主键:保证 grade和number组合的student_id唯一
                models.UniqueConstraint(fields=['grade', 'number'], name='student_id'),
            ]
    

    设置约束的写法如上。
    这里我们只解释下这一个约束本身。(至于meta则会有空在本章(第四章)后面专门说下)

    models.UniqueConstraint(fields=['grade', 'number'], name='student_id')
    

    UniqueConstraint是一个唯一约束,其中fieldsname都是必须要设置的参数

    • fields :字段名列表,指定哪几个字段名要满足唯一约束。
    • name :约束名。
      注意:这里的约束名只是该约束的名称而已,不是数据库的字段,不能用该约束名去搜索查找

    3 外键(ForeignKey)

    梳理自官方文档:automatic-primary-key-fields

    在Django里,外键(ForeignKey)是一种关系字段(Relationship fields)
    对于多对一关系,比如一个老师可以设置多个课程,可以直接像下面这样来写:

    class Teacher(models.Model):
    	name = models.CharField(max_length=50, verbose_name="姓名")
    	# other attritudes ...
    
    class Course(models.Model):
    	name = models.CharField(max_length=50, verbose_name="课程名")
    	# other attritudes ...
    
    	teacher = models.ForeignKey(Teacher, verbose_name="课程教师", on_delete=models.CASCADE)
    

    ForeignKey有两个必需要设置的参数:

    • to:第一个参数,指定其外键是哪个模型,上面的例子中是Teacher
    • on_delete: 当被一个ForeignKey引用的对象被删除时,Django将模拟on_delete参数指定的SQL约束对应的行为。通俗的来讲,这个参数设置的是删除外键引用的对象时的影响。

    on_delete的可选项可以在django.db.models中找到,具体如下

    • CASCADE:联级删除,删除外键引用的对象时,也删除所有包含该外键的对象。
      比如一个老师对应多个课程,删除一个老师,也删除该老师的所有课程。
    • PROTECT: 阻止删除(通过抛出异常 ProtectedError
    • SET_NULL: 将外键设置为null
    • SET_DEFAULT: 将外键设置为default
    • SET()
    • DO_NOTHING

    4 其他关系

    本文第三部分中的外键ForeignKey是一种多对一关系,
    除了这种,Django中还实现了其他关系字段,这里罗列下并展示下其简单写法,
    想了解更多可以通过点击其对应的链接去看对应的官方文档

    # 一个课程可以有多个助教,一个助教可以辅导多个课程,这是一种多对多关系
    assistant = models.ForeignKey(Teacher, verbose_name="助理教师")
    
    • OneToOneField
    # 比如每一个老师都有一个自己的单独办公室,是一种一对一关系
    class Office(models.Model):
    	number = models.CharField(max_length=50, verbose_name="办公室号码")
    	# other attritudes ...
    
    	teacher = models.ForeignKey(Teacher, verbose_name="办公室老师")
    
  • 相关阅读:
    MySQL DELAY_KEY_WRITE Option
    More on understanding sort_buffer_size
    myisam_sort_buffer_size vs sort_buffer_size
    share-Nothing原理
    GROUP_CONCAT(expr)
    Mysql History list length 值太大引起的问题
    Why is the ibdata1 file continuously growing in MySQL?
    洛谷1201 贪婪的送礼者 解题报告
    洛谷1303 A*B Problem 解题报告
    洛谷2142 高精度减法 解题报告
  • 原文地址:https://www.cnblogs.com/BigShuang/p/14285589.html
Copyright © 2020-2023  润新知