Django模型方法中如何筛选关联当前实例的结果对象
Django Quiz模型关联结果查询解答
筛选参数填写值
在Quiz的实例方法show_results中,filter的quiz参数直接传入self即可,self对应当前调用该方法的Quiz实例,匹配的就是所有关联到当前测验的ABCD结果记录。
补全后的方法代码:
class Quiz(models.Model): name = models.CharField(max_length=250) def show_results(self): return ABCD.objects.filter(quiz=self)
现有模型定义的逻辑错误
你当前使用OneToOneField建立Quiz和ABCD的关联是不符合业务需求的:
OneToOneField为一对一关系,数据库层面会强制约束1个Quiz实例只能绑定1条ABCD记录,根本无法实现「单个测验对应多份用户结果」的逻辑- 要匹配一对多的业务场景,需要将ABCD模型的关联字段替换为
ForeignKey(外键,多对一关系),允许多个ABCD记录指向同一个Quiz实例,修正后的字段定义:
class ABCD(models.Model): # 替换OneToOneField为ForeignKey,可按需设置related_name自定义反向关联字段名 quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name="results") points = models.IntegerField()
配置外键后,除了自定义的show_results方法,你也可以直接使用Django提供的反向关联能力查询结果:如果不设置related_name,反向访问字段为abcd_set,调用方式为当前quiz实例.abcd_set.all();如果像上面代码一样设置了related_name="results",直接调用当前quiz实例.results.all()就能拿到所有关联结果,不需要额外写自定义方法。
内容的提问来源于stack exchange,提问作者Shuvam Jaswal
相关产品推荐
相关产品推荐

