Фильтр сериалайзера DjangoRestFramework и связанные с ним ограничения

Вот мои модели:

class Org:
    name = CharField()
    owner = ForeignKey(User)

class Cafe:
    name = CharField()
    org = ForeignKey(Org)

 class Product:
    name = CharField()

 class Assortment:
    cafe = ForeignKey(Cafe)
    product = ForeignKey(Product)
    price = IntegerField

Так что дело в том, что мне нужно искать продукты очень специфическим способом. Это должно выглядеть так: /assortment/search/? Searh = cola

'cafe':{
    'id:1,
    'name': 'Foo',
    'assortment': [
        {
           'product': {
               'id': 1,
               'name': 'Cola'
           },
           'price': 100
        },
        {
           'product': {
               'id': 2,
               'name': 'Coca-cola'
            },
            'price': 200,
        }
    ],
    'search_count': 5,
},
'cafe': {
    'id':2,
    'name': 'Bar',
    'assortment': [
        {
            'product': {
                 'id': 3,
                 'name': 'Sprite-cola',
             },
             'price': 150,
        },
    ] 
    'search_count': 1,
}

Так что проблема в том, когда я ищу, как

Cafe.objects.filter(assortment__product__name='cola')

Он работает, он показывает все кафе, где существует продукт с именем "кола", но проблема заключается в DJF сериализатор

class CafeSerialzier:
     assortments = AssortmentSerializer(source='assortment_set')
     search_count = IntegerField(source='assortment_set.count')

Ассортименты и search_count показывает весь ассортимент и количество его, и не учитывает аргументы поиска, что ожидается. Таким образом, вопрос - как передать параметры поиска в source='assortment_set' (также мне нужно ограничить результаты до 3) и как посчитать все результаты поиска. Я попробовал SerializerMethodField для случайных ситуаций, он решает часть моих проблем, но вызывает много запросов. Переопределение get_field Метод имеет те же проблемы. Так есть ли разумный способ отфильтровать и ограничить связанное с набором запросов поле в ModelSerializer и получить количество неограниченных, но отфильтрованных наборов запросов того же поля?

1 ответ

Вы пытаетесь получить ассортиментный ресурс через: /assortment/search/?search=cola поэтому ваш ответ должен содержать не ресурсы кафе, а ресурсы ассортимента, например:

[
    {
       'product': {
           'id': 1,
           'name': 'Cola'
       },
       'price': 100,
       'cafe': 1 # id of the cafe or any extra information
    },
    {
       'product': {
           'id': 2,
           'name': 'Coca-cola'
        },
        'price': 200,
        'cafe': 1 # id of the cafe or any extra information
    }
]

Вы должны создать ListView за Assortment модель с AssortmentSerializer, Вместо того, чтобы использовать Cafe.objects.filter(assortment__product__name='cola') вы будете использовать Assortment.objects.filter(product__name='cola') в вашем поиске (список).

Другие вопросы по тегам