Django框架之ORM多表关联操作

一、创建基表

设置了abstract为True的模型类,称之为基表,这样的模型类是专门作为基类来提供公有属性的

  • Model类的内部配置Meta类要设置abstract=True
# Model类的内部配置Meta类要设置abstract=True,这样的Model类就是用来作为基表
from django.db import models

class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    create_time = models.DateTimeField(auto_now_add=True)

    # 类中在定义一个类就代表是配置,约定俗成都叫Meta
    class Meta:
        # 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表
        abstract = True

class Book(BaseModel):
    ...

二、ORM多表关联操作

'''
外键所放位置
    一对多:外键放在多的一方
    多对多:外键放在常用的一方
    一对一:外键放在不常用的一方
    外键字段为正向查询字段,related_name是反向查询字段(别名)
外键如何断关联
    设置外键字段db_constraint=False
外键间的级联关系
    一对一:作者没了,详情也没:on_delete=models.CASCADE
    一对多:出版社没了,书还是那个出版社出版:on_delete=models.DO_NOTHING
    一对多:部门没了,员工没有部门(空部门):null=True, on_delete=models.SET_NULL
    一对多:部门没了,员工进入默认部门(默认值):default=0, on_delete=models.SET_DEFAULT
    多对多:不能设置on_delete
'''

重点:

  • 一对一外键:应该设置在关联方的表中。因为是先有被关联表,再有关联表。

  • 外键字段为正向查询字段,related_name是反向查询字段(别名)

    author = models.OneToOneField(
        to="Author",related_name="detail",db_constraint=False,
        on_delete=models.CASCADE
    )
  • 外键如何断关联:db_constraint=False

实例:

class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    create_time = models.DateTimeField(auto_now_add=True)

    # 类中在定义一个类就代表是配置,约定俗成都叫Meta
    class Meta:
        # 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表
        abstract = True


class Book(BaseModel):
    name = models.CharField(max_length=16)
    price = models.DecimalField(max_digits=9,decimal_places=2)
    # 设置外键字段,取反向查除的别名,断开连接,不设置级联删除
    publish = models.ForeignKey(
        to="Publish",related_name="books",db_constraint=False,
        on_delete=models.DO_NOTHING
    )
    # 重点:多对多外键实际在关系表中,ORM默认关系表中两个外键都是级联
    # ManyToManyField字段不提供设置on_delete,如果想设置关系表级联,只能手动定义关系表
    authors = models.ManyToManyField(
        to="Author",related_name="books",db_constraint=False
    )

class Publish(BaseModel):
    name = models.CharField(max_length=16)
    address = models.CharField(max_length=64)

class Author(BaseModel):
    name = models.CharField(max_length=16)
    sex = models.IntegerField(choices=[(0, '男'),(1, '女')], default=0)

class AuthorDetail(BaseModel):
    mobile = models.CharField(max_length=11)
    # 有作者可以没有详情,删除作者,详情一定会被级联删除
    # 外键字段为正向查询字段,related_name是反向查询字段
    author = models.OneToOneField(
        to="Author",related_name="detail",db_constraint=False,
        on_delete=models.CASCADE
    )

猜你喜欢

转载自www.cnblogs.com/XuChengNotes/p/11909228.html