Django distinct query все еще возвращает дубликаты
У меня есть список покупок, который я могу заполнить, добавив все ингредиенты из рецепта. Я хочу запросить Shopping, чтобы получить все уникальные рецепты, присутствующие в списке покупок, однако мой отчетливый запрос возвращает дубликаты
#query
ShoppingItems.objects.filter(user=account, shoppingList=shoppingList, recipe__isnull=False).values('recipe').distinct()
#returns > <ShoppingItemsQuerySet [{'recipe': 47}, {'recipe': 47}, {'recipe': 47}, {'recipe': 47}, {'recipe': 47}, {'recipe': 47}, {'recipe': 47}, {'recipe': 47}, {'recipe': 47}, {'recipe': 47}]>
#shopping/models.py
class ShoppingLists(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=30)
class ShoppingItemsQuerySet(models.QuerySet):
def by_user_id(self, user_id):
return self.filter(user_id=user_id)
class ShoppingItemsManager(models.Manager):
def get_queryset(self):
return ShoppingItemsQuerySet(self.model, using=self._db)
class ShoppingItems(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
shoppingList = models.ForeignKey(ShoppingLists, on_delete=models.CASCADE)
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, blank=True, null=True)
name = models.CharField(max_length=220, blank=True, null=True) # chicken
objects = ShoppingItemsManager()
# recipes.models.py
class Recipe(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
image = models.ImageField(upload_to='image/', blank=True, null=True)
name = models.CharField(max_length=220) # grilled chicken pasta
class RecipeIngredient(models.Model):
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
ingredient = models.ForeignKey(Ingredient, null=True, on_delete=models.SET_NULL)
Если вы хотите выбрать отдельные значения из определенного поля, то рекомендуется указать это поле вместе с id в distinct, так будет точнее
Чтобы выразить в коде, в вашем случае отличия будут выглядеть следующим образом:
ShoppingItems.objects.filter(user=account, shoppingList=shoppingList, recipe__isnull=False).distinct('id', 'recipe').values('recipe')