• 主外关系: 关联操作
    • models.CASCADE 级联删除 和 models.SET_NULL 设置为 NULL
  • 一对多关系: ForiegnKey 写在一对多关系中,多的那个模型中

一对多

使用 django.db.models.ForiegnKey

  1. from django.db import models
  2. class VolksWagenwerk(models.Model):
  3. name = models.CharField(max_length=20)
  4. class Benz(models.Model):
  5. volkswagenwerk = models.ForiegnKey( # 将外键写在多
  6. VolksWagenwerk,
  7. on_delete=models.CASCADE
  8. )
  9. name = models.CharField(max_length=20)
  • 外键名是对应类名的小写
  • on_delete 是必须属性

一对一

使用 django.db.models.OneToOneField

  1. class Place(models.Model):
  2. name = models.CharField(max_length=50)
  3. address = models.CharField(max_length=80)
  4. class Fone(models.Model):
  5. place = models.OneToOneField(
  6. Place,
  7. on_delete=models.CASCADE,
  8. primary_key=True # 设置该字段为主键
  9. )
  10. server_drs = models.BooleanField(default=False)
  11. class Emp(models.Model):
  12. fone = models.ForeignKey(Fone, on_delete=models.CASCADE)
  13. name = models.CharField(max_length=20)from django.db import models
  14. class VolksWagenwerk(models.Model):
  15. name = models.CharField(max_length=20)
  16. class Benz(models.Model):
  17. volkswagenwerk = models.ForiegnKey(VolksWagenwerk, on_delete=models.CASCADE)
  18. name = models.CharField(max_length=20)

多对多

使用 django.db.models.ManyToManyField,会生成一个中间表

自关联

  1. class Student(models.Model):
  2. name = models.CharField(max_length=20)
  3. friends = models.ManyToManyField('self')

简易多对多

  1. class SchoolClass(models.Model):
  2. name = models.CharField(max_length=20)
  3. class Teacher(models.Model):
  4. name = models.CharField(max_length=10)
  5. school_class = models.ManyToMany(SchoolClass)

自定义中间表

  1. class Person(models.Model):
  2. name = models.CharField(max_length=20)
  3. class Group(models.Model):
  4. name = models.CharField(max_length=100)
  5. member = models.ManyToManyField(
  6. Person,
  7. through= 'Membership', # 必须是类名的字符串
  8. through_fields=('group', 'person')
  9. )
  10. class Membership(models.Model): # 自定义中间表
  11. group = models.ForeignKey(Group, on_delete=models.CASCADE)
  12. person = models.ForeignKey(Person, on_delete=models.CASCADE)
  13. score = models.IntegerField(default=1)
  • 通过 through=’Membership’ 指定 Merbership 作为中间表
  • 通过 through_field=(‘group’, ‘person’) 指定中间模型的属性
  • 一般需要自定义中间表时,都有额外的字段,譬如 score = models.IntegerField(default=1)