Django模型类关系

模型类关系

  • A表–>B表是一对一关系

    1
    2
    # 定义在A表或B中任意一个添加都可以, 后面跟随的是另一个关联的类名
    b = models.OneToOneField('A', on_delete=models.CASCADE)
  • A表–>B表是一对多的关系

    1
    2
    # 在B表中添加外键指向A表,后面跟随的是A表的类名
    b = models.ForeignKey('A', on_delete=models.CASCADE)
  • A–>B表是多对多的关系

    1
    2
    # 在A或B中任意一个添加都可以,后面跟随的是另一个关联的类名
    b = models.ManyToManyField('A')
  • 自关联

    1
    2
    # 自关联指当前表的外键子段直接关联本表的主键,外键:hook
    hook = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)

关联查询

  • 通过数据对象查询

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # B中的外键子段是hook
    # 通过A中某一个主键值查询出B中所有与之关联的数据
    a = A.objects.get(id=1)
    # 此处的b必须为B类的小写
    a.b_set.all()

    # 通过B中的外键获取到与之关联的A中的对象
    b = B.objects.get(id=1)
    a = b.hook
  • 通过模型类对象进行查询

    筛选条件的查询类中,如果有关系属性,则应该通过关系属性查询,反之应该通过类名(小写)查询

    1
    2
    3
    4
    5
    6
    # A-->B是一对多的关系,B类的外键为hook
    # 通过B类的条件查询A类的数据:A类名.objects.filter(B类名小写__B类属性名__筛选条件)
    A.objects.filter(b__id__gt=3)

    # 通过A类的条件查询B类的数据:B类名.objects.filter(B类外键名__A类属性名__筛选条件)
    B.objects.filter(hook__id__gt=3)

管理器

  • 模型类.objects:管理器对象

    django中创建一个模型类,都会给我们自动生成一个manager管理器对象(objects),一旦我们自定义管理器对象后,django就不会再为我们自动创建管理器对象了,他的主要作用如下:

    • 改变查询的结果集

      比如将all()方法的结果进行筛选

    • 添加额外的方法

      添加额外的方法帮助我们操作模型类对应的数据表

  • 自定义模型管理器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # 自定义模型管理器需要继承models.Manager类
    class BookManager(models.Manager):

    # 修改返回集
    def all(self):
    data = super().all() # super, 直接调用父类的all方法
    re_data = data.filter(id__gt=3)
    return re_data

    # 添加/修改方法
    def add_data(self, hname, hskill, hhook):
    # self.model()可以直接返回引用该方法的类对象
    # name = self.model()
    name = Hero()
    name.hname = hname
    name.skill = hskill
    name.hhook = hhook
    name.save()
    return name

    class Hero(models.Model):
    hname = models.CharField(max_length=60)
    hskill = models.CharField(max_length=20)
    hhook = models.ForeignKey('Book', on_delete=models.CASCADE)

    # 使用自定管理器
    objects = BookManager()

元选项

  • 解决问题

    django中表的格式默认依赖于应用名称:【应用名称】.【类名小写】,如果应用名称发生了变化,则程序就会因为无法寻找到表格而发生错误,此时我们可以通过元选项指定模型类对应的表名

  • 使用方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 需要在模型类中定义一个元选项
    class skill(models.Model):
    hname = models.CharField(max_length=20)
    Hero_type = models.OneToOneField('Book', on_delete=models.CASCADE)

    # Meta、db_table:都是固定的,dbtable对应于表名
    class Meta:
    db_table = 'skill'

    # 定义好以后需要重新生成模型类
    python manage.py makemigrations
    python manage.py migrate