Django查询多个相关对象

时间:2019-08-21 13:47:59

标签: django django-orm

我在跨多个模型进行查询时遇到麻烦。

这是我要显示的所有动物及其相应疫苗的清单,状态为“进行中”,免疫日期为未来。

def current_with_futur_vaccines(self):
    return (
        Encounter.objects.filter(
            status="in-progress").filter(
            subject__immunizations__recorded__gte=datetime.now(),
        )
        .select_related("subject")
        .prefetch_related("subject__immunizations", "location")
    )

问题是,当我想从查询中列出免疫接种时,我获得了该动物的所有免疫接种,而不仅是将来必须进行的免疫接种。

{% for immunization in object.subject.immunizations.all %}
     {{ immunization }}
{% endfor %}

这是模型

class Animal(models.Model):
    name = models.CharField(max_length=250)

class Encounter(models.Model):
        subject = models.ForeignKey(Animal, on_delete=models.PROTECT)
        status = models.CharField(max_length=11)

class Vaccine(models.Model):
        name = models.CharField(max_length=250)

class Immunization(models.Model):
    subject = models.ForeignKey(
        Animal, on_delete=models.PROTECT, related_name="immunizations"
    )
    recorded = models.DateTimeField(default=timezone.now)
    vaccine = models.ForeignKey(Vaccine, on_delete=models.PROTECT)

编辑 当我调用all()时,我并不希望获得与FK相关的所有结果。我想要的是查询过滤的结果。在我的示例中,所有遇到的事件都用记录的日期进行了过滤,但是当我可以使用.all()进行相关的免疫接种条目时,我得到的过滤的免疫接种结果并未按记录进行过滤,而是全部过滤。

编辑2:

我想我已经通过使用过滤的预取来解决了。像这样的东西。

def current_with_futur_vaccines(self):
    immunizations_prefetch =  models.Prefetch("subject__immunizations", Immunizations.objects.filter(recorded__gte=datetime.now())
    return (
        Encounter.objects.filter(
            status="in-progress").filter(
            subject__immunizations__recorded__gte=datetime.now(),
        )
        .select_related("subject")
        .prefetch_related(immunizations_prefetch, "location")
    )

1 个答案:

答案 0 :(得分:0)

您没有动物模型中涉及免疫的外键/ M2M参考。