related_name:
related_name 是一个可选的参数,用于在一个模型中指定与另一个模型之间的关系的反向关系的名称。通常,使用related_name允许我们在查询相关对象时使用直观和易记的属性名称。
例:
两张表,如果只有一个Foreignkey,可以直接反向查询
class UserInfo(models.Model):
emp_num = models.CharField(max_length=8, verbose_name='员工号', unique=True)
class ProjectUser(models.Model):
# 关联到UserInfo ,只有 user 字段关到 UserInfo 表
user = models.ForeignKey(verbose_name='参与者', to='UserInfo', on_delete=models.CASCADE)
直接反向查询
# 从UserInfo表中查询id=1的对象
obj = UserInfo.objects.filter(id=1)
# 小写表名_set 格式,反向关联查询obj对象在 ProjectUser 表中的 user 字段信息
obj.projectuser_set.all()
如果有一个或多个Foreignkey, 就需要使用 related_name 属性
class UserInfo(models.Model):
emp_num = models.CharField(max_length=8, verbose_name='员工号', unique=True)
class ProjectUser(models.Model):
# user 和 invitee 两字段都 关联 到 UserInfo 表
# 直接使用 obj.projectuser_set.all() 会报错,不清楚从哪个字段反向查询数据
# 需要增加 related_name 属性
user = models.ForeignKey(verbose_name='参与者', to='UserInfo', on_delete=models.CASCADE, related_name = 'a')
invitee = models.ForeignKey(verbose_name='邀请者', to='UserInfo',on_delete=models.CASCADE, related_name = 'b')
# 从UserInfo表中查询id=1的对象
obj = UserInfo.objects.filter(id=1)
# 如果要反向关联查询 user 字段:
obj.a.all()
# 如果要反向关联查询 invitee 字段:
obj.b.all()