DjangoRestFramework序列化器过滤器和限制相关

时间:2017-10-23 15:24:30

标签: django django-rest-framework django-queryset serializer related-content

这就是我的模特:

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

所以这笔交易是 - 我需要以非常具体的方式搜索产品。 它应该是这样的: /分类/搜索/?searh =可乐

'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')

assortments和search_count显示它的所有分类和计数,并且不考虑预期的搜索参数。所以问题是 - 如何将搜索参数传递给source =' assortment_set' (我还需要将结果限制为3)以及如何计算所有搜索结果。 我已经尝试过SerializerMethodField用于assrotments,它解决了我的一部分问题,但它导致了很多查询。 覆盖get_field方法具有相同的问题。 那么有没有理智的方法来过滤和限制ModelSerializer中的查询集相关字段,并获得相同字段的无限但已过滤的查询集的计数?

1 个答案:

答案 0 :(得分:0)

您正试图通过以下方式获取分类资源:/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
    }
]

您应该使用ListViewAssortment模型创建AssortmentSerializer。您可以在搜索视图(列表视图)中使用Cafe.objects.filter(assortment__product__name='cola'),而不是使用Assortment.objects.filter(product__name='cola')