Django根据另一个模型中最后一个数据的字段值过滤对象
Django filter objects based on the value of a field of the last data in another model
有2个模型
class A(models.Model):
name = models.TextField()
class B(models.Model):
a = models.ForeignKey(A)
status = models.BooleanField(default=False)
现在我想根据class B状态中的最后数据过滤class A的对象。
如果模型B有2个数据
id | a | status
1 | a | True
2 | abc | False
3 | a | False
4 | abc | True
因此,如果我想过滤状态为 False 的模型 A 的对象。
在这种情况下,它会给我
a
.
如果我想过滤模型 A 中状态为 True 的对象。
在这种情况下它应该 return 我
abc
.
我想写一个类似于
的查询
A.objects.filter(b__status__last=True)
是否可以使用过滤器?
请尝试:
from django.db.models import Max, F
A.objects.annotate(latest=Max('b__id')).filter(b__id=F('latest'),b__status=True)
我认为你可以在这里有效地使用注释。
A.objects.annotate(latest_b=Max("b__created_at")).filter(b__status=True).latest('latest_b')
在这里,我们将 A
的每个对象注释为具有一个 latest_by
字段,然后在按 b 的状态过滤后获取最新的对象。这应该可以正常工作。
有2个模型
class A(models.Model):
name = models.TextField()
class B(models.Model):
a = models.ForeignKey(A)
status = models.BooleanField(default=False)
现在我想根据class B状态中的最后数据过滤class A的对象。
如果模型B有2个数据
id | a | status
1 | a | True
2 | abc | False
3 | a | False
4 | abc | True
因此,如果我想过滤状态为 False 的模型 A 的对象。 在这种情况下,它会给我
a
.
如果我想过滤模型 A 中状态为 True 的对象。
在这种情况下它应该 return 我
abc
.
我想写一个类似于
的查询A.objects.filter(b__status__last=True)
是否可以使用过滤器?
请尝试:
from django.db.models import Max, F
A.objects.annotate(latest=Max('b__id')).filter(b__id=F('latest'),b__status=True)
我认为你可以在这里有效地使用注释。
A.objects.annotate(latest_b=Max("b__created_at")).filter(b__status=True).latest('latest_b')
在这里,我们将 A
的每个对象注释为具有一个 latest_by
字段,然后在按 b 的状态过滤后获取最新的对象。这应该可以正常工作。