在Django queryset中进行Join以筛选i

2024-04-25 13:42:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个查询集,我想加入,但我不确定如何继续。我想根据在每个查询集中创建的两个注释过滤数据

模型

class Recipe(models.Model):
  name = models.CharField(max_length=50)
  steps = models.ManyToManyField(StepRecipe)

class StepRecipe(models.Model):
  ingredients = models.ManyToManyField(RecipeIngredient)

class RecipeIngredient(models.Model):
  ingredient = models.ForeignKey(Ingredient)

class Ingredient(models.Model):
  name = models.CharField(max_length=50)

分步查询

^{pr2}$

我想合并两个结果并在最后按.filter(total=F('sum'))进行筛选。过滤后,这将导致只显示ID为2的对象,因为total=4,available=4。

我知道我有|运算符。我得做点什么:

result = q1 | q2

但是每当我这样做时,其中一个注释就会消失(最后一个,在本例中是q2注释,它是available)。有什么想法吗?如果数据库能做到这一点,我不想迭代它们。在

奇怪的是,有时候当我把所有的东西放在一行时,它常常会给我预期的结果。我觉得这可能是个虫子。我想它以某种方式缓存了结果。。。在

这就是我所做的,并且几次都是正确的结果:

queryset = Recipe.objects.all()
        .annotate(total=Count('steps__ingredients', distinct=True))
        .filter(steps__ingredients__ingredient__name__in=ingredients)
        .annotate(sum=Count('steps__ingredients', distinct=True))
        .filter(total=F('sum'))

我使用的是MySQL 5.6和Django 1.11

我试图使用.intersection(),这是django1.11中的新功能,但它也不起作用(我的数据库显然不支持)。我考虑过使用.union(),但是这个函数也发生了同样的事情:一个注释消失了。虽然,有一个消失了,我想我可以看到任何出现两次的东西,然后过滤掉。但是。。。又是一个错误!当我试图注释时,我得到了IndexError: list index out of range

如果有一个更好的主意(不是迭代)或者一个好的方法来解决这个问题,我会很感激的。谢谢!在


Tags: namemodelmodelsrecipefilterstepslengthmax