Django外键关联场景下通过Deligate查询所属Event的QuerySet问题
Django外键关联查询解决方法
问题排查
你现有代码的错误主要有2点:
- 混淆了外键的正向/反向查询规则,错误使用related_name做正向查询,且
&运算符用法完全不符合QuerySet的逻辑 paid_event是Event模型的字段,不能直接通过Deligate实例访问
另外注意你Deligate模型的related_name参数值多了多余空格,participating_ event的下划线和event之间的空格会导致后续反向查询报错,建议先修正为participating_event。
实现逻辑
Django正向访问外键关联对象的规则非常简单:拿到当前Deligate实例后,直接通过外键字段名event即可获取关联的Event对象,不需要额外写复杂的查询条件。
修正后代码
class Event(models.Model): event_title = models.CharField(max_length=30) about_event = models.TextField() paid_event = models.BooleanField(default=False) created_on = models.DateTimeField(auto_now_add=True) updated_on = models.DateTimeField(auto_now=True) class Deligate(models.Model): # 去掉related_name里的多余空格 event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='participating_event') deligate_name = models.CharField(max_length=10, blank=True, null=True) deligate_bio = models.TextField(blank=True, null=True) created_on = models.DateTimeField(auto_now_add=True) updated_on = models.DateTimeField(auto_now=True) def event_check_view(request, pk): # 可选优化:用select_related连表查询,只发起1次数据库请求,提升性能 deli = Deligate.objects.select_related('event').get(pk=pk) # 直接通过外键字段访问关联Event对象的paid_event属性 if deli.event.paid_event: # 付费活动逻辑 pass else: # 免费活动逻辑 pass
内容的提问来源于stack exchange,提问作者Abdul Giwa
相关产品推荐
相关产品推荐

