【发布时间】:2020-12-08 12:06:29
【问题描述】:
(我认为问题的标题远非完美,这可能是我找不到任何有用帮助的原因。欢迎编辑!)
假设以下模型:
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()
]
第二个问题是:上面的查询集是否可以扩展为包含额外的行,如果某个人绝对最喜欢的比萨饼从未被那个人吃过,则可以使用None for date,即,如果在TopPizzasForPerson 中存在某个person 和pizza 的条目,而is_nearly_perfect 是True,但person 和pizza 的组合中不存在PizzaPersonDateRelation 的条目
【问题讨论】: