Фильтр Django ManyToMany подан в запросе - PullRequest
0 голосов
/ 27 ноября 2018

Мне нужно отфильтровать поле с ManyToMany в наборе запросов.Там должны оставаться только активные Продукты

class Product(model.Model):
    name = models.CharField()
    active = models.BooleanField(blank=True, default=True)


class Package(model.Model):
    name = models.CharField()
    products = models.ManyToManyField(Product)

Я пытался что-то вроде этого.

packages = Package.objects.all()
for package in packages:
    active_products = package.products.filter(active=True)
    package.products = active_products

, но он обновляет мои пакеты в базе данных, когда мне нужно только изменить набор запросов.

концепция ожидания (на самом деле не требуется вложенная структура, набор запросов в порядке):

 packages = [
    {'id': 1, 'name': 'First package', 'products': [
        {'id': 1, 'name': 'first product', 'active': True},
        {'id': 2, 'name': 'second product', 'active': True},
    ]},
    {'id': 2, 'name': 'Second package', 'products': [
        {'id': 2, 'name': 'first product', 'active': True},
        {'id': 3, 'name': 'third product', 'active': True},
    ]},
    {'id': 3, 'name': 'Third package', 'products': []}

]

Я думал о создании списка словарей из пакетов с помощью .values ​​(), затем выполните итерацию и исключите все неактивные продукты.Вы знаете какой-нибудь более изящный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Я не уверен, будет ли это работать.Но я думаю, что мы можем играть, используя serializers.MethodSerialier.Если это не удастся, вероятно, мы можем попытаться вернуть другую вещь вместо Productserializer напрямую.

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ('id', 'name')


class PackageSerializer(serializers.ModelSerializer):
    products = serializers.MethodSerializer()

    class Meta:
        model = Package
        fields = ('id', 'name', 'products')

    def get_products(self, obj):
        products = obj.products.filter(active=True)
        return ProductSerializer(products, many=True)


packages = Package.objects.filter(products__active=True)
serializer = PackageSerializer(packages, many=True)
# do something with the serializer
0 голосов
/ 27 ноября 2018

AFAIK, вы не получите вложенного вывода от Джанго :( Но вы получите что-то подобное с .values() метод QuerySet class as,

results = Package.objects.filter(products__active=True).values('id', 'name', 'products__id', 'products__name', 'products__active')
filtered_result = [result for result in results if result['products__active']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...