0

那是我的模型:

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

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

4

1 回答 1

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
    }
]

您应该创建一个带有ListView. 您将在搜索视图(列表视图)中使用而不是使用。AssortmentAssortmentSerializerCafe.objects.filter(assortment__product__name='cola')Assortment.objects.filter(product__name='cola')

于 2017-10-24T09:10:13.217 回答