- 主外关系: 关联操作
- models.CASCADE 级联删除 和 models.SET_NULL 设置为 NULL
- 一对多关系: ForiegnKey 写在一对多关系中,多的那个模型中
一对多
使用 django.db.models.ForiegnKey
from django.db import modelsclass VolksWagenwerk(models.Model):name = models.CharField(max_length=20)class Benz(models.Model):volkswagenwerk = models.ForiegnKey( # 将外键写在多VolksWagenwerk,on_delete=models.CASCADE)name = models.CharField(max_length=20)
- 外键名是对应类名的小写
- on_delete 是必须属性
一对一
使用 django.db.models.OneToOneField
class Place(models.Model):name = models.CharField(max_length=50)address = models.CharField(max_length=80)class Fone(models.Model):place = models.OneToOneField(Place,on_delete=models.CASCADE,primary_key=True # 设置该字段为主键)server_drs = models.BooleanField(default=False)class Emp(models.Model):fone = models.ForeignKey(Fone, on_delete=models.CASCADE)name = models.CharField(max_length=20)from django.db import modelsclass VolksWagenwerk(models.Model):name = models.CharField(max_length=20)class Benz(models.Model):volkswagenwerk = models.ForiegnKey(VolksWagenwerk, on_delete=models.CASCADE)name = models.CharField(max_length=20)
多对多
使用 django.db.models.ManyToManyField,会生成一个中间表
自关联
class Student(models.Model):name = models.CharField(max_length=20)friends = models.ManyToManyField('self')
简易多对多
class SchoolClass(models.Model):name = models.CharField(max_length=20)class Teacher(models.Model):name = models.CharField(max_length=10)school_class = models.ManyToMany(SchoolClass)
自定义中间表
class Person(models.Model):name = models.CharField(max_length=20)class Group(models.Model):name = models.CharField(max_length=100)member = models.ManyToManyField(Person,through= 'Membership', # 必须是类名的字符串through_fields=('group', 'person'))class Membership(models.Model): # 自定义中间表group = models.ForeignKey(Group, on_delete=models.CASCADE)person = models.ForeignKey(Person, on_delete=models.CASCADE)score = models.IntegerField(default=1)
- 通过 through=’Membership’ 指定 Merbership 作为中间表
- 通过 through_field=(‘group’, ‘person’) 指定中间模型的属性
- 一般需要自定义中间表时,都有额外的字段,譬如 score = models.IntegerField(default=1)
