Фильтр-посредник ManytoMany django с отрицанием - PullRequest
0 голосов
/ 14 февраля 2020

Этот вопрос относится к: Фильтр-посредник ManytoMany django

class Ingredient(Model):
    name = CharField(max_length=55, unique=True)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('name',)



class Product(Model):
    name = CharField(max_length=55)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('name', )


class ProductIngredient(Model):
    product = ForeignKey(Product, on_delete=CASCADE, related_name='product_ingredients')
    ingredient = ForeignKey(Ingredient, on_delete=CASCADE)
    optional = BooleanField(default=False)

    class Meta:
        unique_together = (('product', 'ingredient'),)
        ordering = ('product__name',)

    def __str__(self):
        return f'{self.product} - {self.ingredient}'

Я хочу сделать два запроса:

  • выбрать все товары, чьи ингредиенты не содержат клубнику И молоко
  • выберите все продукты, чьи ингредиенты не содержат клубнику ИЛИ молоко

В этом случае я полностью потерян.

1 Ответ

0 голосов
/ 14 февраля 2020

Ссылаясь на связанный вопрос, вы можете использовать объекты Q с .exclude() вместо .filter(). Вы также можете отрицать объекты Q, добавив к тильде префикс (~):

Продукты с ингредиентами, не содержащими клубнику и молоко

.filter(
    ~Q(product__ingredients__ingredient__name='strawberry') &
    ~Q(product__ingredients__ingredient__name='milk')
)

Продукты с ингредиентами, не содержащими клубнику ИЛИ молоко

.filter(~Q(product__ingredients__ingredient__name__in=['strawberry', 'milk']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...