Django根据另一个模型中最后一个数据的字段值过滤对象

时间:2018-12-12 09:32:23

标签: django django-models django-rest-framework django-filters

有2种型号

class A(models.Model): name = models.TextField()

class B(models.Model): a = models.ForeignKey(A) status = models.BooleanField(default=False)

现在,我要根据B类状态下的最后数据过滤A类对象。

如果有两个B型数据

id | a | status 1 | a | True 2 | abc | False 3 | a | False 4 | abc | True

因此,如果我要过滤状态为False的模型A的对象。 在这种情况下,它将给我

a

如果我想过滤状态为True的模型A的对象。 在这种情况下,它应该还给我 abc

我想写一个类似的查询

A.objects.filter(b__status__last=True)

是否可以使用过滤器?

2 个答案:

答案 0 :(得分:3)

我认为您可以在此处有效使用注释。

inner join

在这里,我们为A.objects.annotate(latest_b=Max("b__created_at")).filter(b__status=True).latest('latest_b') 的每个对象添加了一个A字段,然后按b的状态过滤后获取最新的对象。这应该可以正常工作。

答案 1 :(得分:2)

请尝试:

from django.db.models import Max, F

A.objects.annotate(latest=Max('b__id')).filter(b__id=F('latest'),b__status=True)