(我认为,这个问题的标题远非完美,这可能是我找不到任何有用的帮助的原因。欢迎编辑!
假设以下模型:
class Pizza(models.Model):
name = models.CharField(max_length = 128)
class Person(models.Model):
name = models.CharField(max_length = 128)
下一个模型连接person
和pizza
,并具有一个额外的布尔字段。 例如,假设模型存储每个人的顶级披萨,布尔字段指示相应的披萨是否是相应人员的绝对收藏夹之一。
class TopPizzasForPerson(models.Model):
person = models.ForeignKey(
Person,
related_name = 'top_pizzas',
on_delete = models.CASCADE
)
pizza = models.ForeignKey(
Pizza, on_delete = models.CASCADE
)
is_nearly_perfect = models.BooleanField(default = False)
最后一个模型存储当某个人吃了某个比萨饼时。
class PizzaPersonDateRelation(models.Model):
person = models.ForeignKey(
Person,
related_name = 'eaten_pizzas',
on_delete = models.CASCADE
)
pizza = models.ForeignKey(Pizza)
date = models.DateField()
我想要一个列表,其中包含某人吃特定披萨的最后日期。因此,应该出现PizzaPersonDateRelation
的所有person
和pizza
组合,但如果多次出现此组合,则只应包括最后一个。目前,我通过以下方式执行此操作:
qs = PizzaPersonDateRelation.objects
.distinct('person', 'pizza')
.order_by('person', 'pizza', '-date')
我现在的第一个问题是:如何将上述查询集限制为仅包含每个人绝对喜欢的比萨饼,即TopPizzasForPerson.is_nearly_perfect
在哪里True
?
以下是我在 python 级别而不是数据库级别执行此操作的方法:
[
data for data in qs
if data.person.top_pizzas.filter(pizza = data.pizza, is_nearly_perfect = True).exists()
]
第二个问题是:是否可以扩展上述查询集以包含其他行,如果某人绝对喜欢的披萨从未被该人吃过,则可能带有date
None
,即,如果某个person
和pizza
的TopPizzasForPerson
条目, 并且is_nearly_perfect
是True
,但person
和pizza
的组合在PizzaPersonDateRelation
中不存在
此查询应该得到您所问的内容。
PizzaPersonDateRelation.objects
.filter(person__top_pizzas__is_nearly_perfect=True)
.distinct('person', 'pizza')
.order_by('person', 'pizza', '-date')
您可以使用related_name
遍历相关模型。