按外键的字段筛选不同的查询集



(我认为,这个问题的标题远非完美,这可能是我找不到任何有用的帮助的原因。欢迎编辑!

假设以下模型:

class Pizza(models.Model):
name = models.CharField(max_length = 128)
class Person(models.Model):
name = models.CharField(max_length = 128)

下一个模型连接personpizza,并具有一个额外的布尔字段。 例如,假设模型存储每个人的顶级披萨,布尔字段指示相应的披萨是否是相应人员的绝对收藏夹之一。

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的所有personpizza组合,但如果多次出现此组合,则只应包括最后一个。目前,我通过以下方式执行此操作:

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()
]

第二个问题是:是否可以扩展上述查询集以包含其他行,如果某人绝对喜欢的披萨从未被该人吃过,则可能带有dateNone,即,如果某个personpizzaTopPizzasForPerson条目, 并且is_nearly_perfectTrue,但personpizza的组合在PizzaPersonDateRelation中不存在

条目

此查询应该得到您所问的内容。

PizzaPersonDateRelation.objects 
.filter(person__top_pizzas__is_nearly_perfect=True) 
.distinct('person', 'pizza')  
.order_by('person', 'pizza', '-date')

您可以使用related_name遍历相关模型。

相关内容

  • 没有找到相关文章

最新更新