Фильтр сериалайзера 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')
в вашем поиске (список).