Django Queryset最新版本的Foreignkey
我有3个链接的Django模型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
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)
你是最棒的。非常感谢你!你是最棒的。非常感谢你!