Django Queryset最新版本的Foreignkey

Django Queryset最新版本的Foreignkey,django,django-views,django-queryset,Django,Django Views,Django Queryset,我有3个链接的Django模型 models.py Assessment(models.Model): finalized = models.BooleanField(default=False) finalized_date = models.DateTimeField(default=blank, blank=True) workstation = models.ForeignKey(Assessment, null=True, blank=True, on_dele

我有3个链接的Django模型

models.py

Assessment(models.Model):
    finalized = models.BooleanField(default=False)
    finalized_date = models.DateTimeField(default=blank, blank=True)
    workstation = models.ForeignKey(Assessment, null=True, blank=True, on_delete=models.SET_NULL)
    class Meta:
         get_latest_by = "finalized_date"

Workstation(models.Model):
    pass

Answer(models.Model):
    score = models.IntegerField(default=0)
    assessment = models.ForeignKey(Assessment, null=True, blank=True, on_delete=models.SET_NULL)
这是我的第一个问题:

我需要一个查询集,返回所有最新的评估(L)

例如,其中(L)是最新的:

Workstation 1    |   Workstation 2    | Workstation 3
------------------------------------------------------
Assessment 1 (L) |  Assessment 12     | Assessment 4
Assessment 2     |  Assessment 41     | Assessment 15 (L)
Assessment 3     |  Assessment 99 (L) | Assessment 9
因此,查询集应返回:
Assessment 1、Assessment 99和Assessment 15

我曾考虑过对工作站进行查询集,然后对进行
循环,但这样做成本太高,会产生大量查询

第二个问题(与第一个问题相关):

实际上,我需要一个查询集,其中包含与工作站的最新评估相关的所有答案

我想我可以把它分解成几个查询集来让它工作,但是如果有一个查询集可以做到这一点,请教育我

因此,一旦我从#1中获得了评估查询集,我将使用下面的查询集来获得我真正需要的内容


final\u queryset=Answer.objects.filter(assessment\u in=queryset\u From\u Problem\u 1)
第一个问题

首先,我认为您的
评估--Workstation
关系颠倒了。根据您的要求,
工作站
可以有多个
评估
,因此模型应为:

Assessment(models.Model):
    workstation = models.ForeignKey(Assessment, null=True, 
                                    blank=True, on_delete=models.SET_NULL)
    finalized = models.BooleanField(default=False)
    finalized_date = models.DateTimeField(default=blank, blank=True)

    class Meta:
         get_latest_by = "finalized_date"

Workstation(models.Model):
    pass
现在,为了得到您想要的,您可以利用Django 1.11中引入的:

from django.db.models import OuterRef, Subquery
latest = Assessment.objects.filter(
    workstation=OuterRef('pk')).order_by('-finalized_date')

workstations = Workstation.objects.annotate(
    latest_assessment_id=Subquery(latest.values('pk')[:1]))
for workstation in workstations:
    print('Assessment {}'.format(workstation.latest_assessment_id))
第二个问题

现在您已经有了评估ID,正如您所说,您只需获得以下答案:

latest_assessments_ids = (w.latest_assessment_id for w in workstations)
answers = Answer.objects.filter(assessment_id__in=latest_assessments_ids)

第一个问题

首先,我认为您的
评估--Workstation
关系颠倒了。根据您的要求,
工作站
可以有多个
评估
,因此模型应为:

Assessment(models.Model):
    workstation = models.ForeignKey(Assessment, null=True, 
                                    blank=True, on_delete=models.SET_NULL)
    finalized = models.BooleanField(default=False)
    finalized_date = models.DateTimeField(default=blank, blank=True)

    class Meta:
         get_latest_by = "finalized_date"

Workstation(models.Model):
    pass
现在,为了得到您想要的,您可以利用Django 1.11中引入的:

from django.db.models import OuterRef, Subquery
latest = Assessment.objects.filter(
    workstation=OuterRef('pk')).order_by('-finalized_date')

workstations = Workstation.objects.annotate(
    latest_assessment_id=Subquery(latest.values('pk')[:1]))
for workstation in workstations:
    print('Assessment {}'.format(workstation.latest_assessment_id))
第二个问题

现在您已经有了评估ID,正如您所说,您只需获得以下答案:

latest_assessments_ids = (w.latest_assessment_id for w in workstations)
answers = Answer.objects.filter(assessment_id__in=latest_assessments_ids)

你是最棒的。非常感谢你!你是最棒的。非常感谢你!