天天看点

django orm级联_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

)