Django查询:如何显示所有干预记录及关联详情(含无关联项)
解决方案
首先修正你模型里的两处错误:
Detail类的article_id字段引用的模型名写错了,要和你定义的模型类名一致(大写Articles),否则Django无法识别对应模型;quantity字段的默认值应该是整数1,而非字符串'1',否则会触发类型错误。
修正后的Detail模型:
class Detail(models.Model): ID = models.AutoField(primary_key=True) article_id = models.ForeignKey(Articles, on_delete = models.CASCADE) Intervention_ID = models.ForeignKey(Interventions, on_delete = models.CASCADE) quantity = models.IntegerField(null=True, blank=True, default=1)
接下来解决查询问题:要获取所有Interventions记录(包括未关联任何Detail的)并同时拉取对应详情,你可以用prefetch_related结合Prefetch对象明确预取规则,确保不会过滤无关联的干预记录:
from django.db.models import Prefetch # 查询所有干预记录,同时预取对应的详情数据 interventions = Interventions.objects.prefetch_related( Prefetch('detail_set', queryset=Detail.objects.all(), to_attr='related_details') ).all()
遍历数据时,每个Intervention对象的related_details属性就是对应的Detail列表(无关联记录时为空列表):
for intervention in interventions: print(f"干预ID: {intervention.ID}") print("关联商品详情:") for detail in intervention.related_details: print(f"商品ID: {detail.article_id.ID}, 数量: {detail.quantity}") print("---")
关于你之前prefetch_related无效的原因
如果你之前直接使用Interventions.objects.prefetch_related('detail_set').all(),理论上也能返回所有干预记录(包括无关联的)。如果没生效,大概率是你在查询中额外加了过滤条件(比如filter(detail__isnull=False)),这类条件会自动过滤掉无关联Detail的记录,检查并移除即可。
内容的提问来源于stack exchange,提问作者GM02
相关产品推荐
相关产品推荐

