0

Das ist meine Modelle bezogen werden:DjangoRestFramework Serializer Filter und Limit

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 

So ist der Deal - ich brauche Produkte mit ganz bestimmten Art und Weise zu suchen. Es sollte wie folgt aussieht: /Sortiment/Suche/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, 
} 

Das Problem ist also - wenn ich wie

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

Es funktioniert, es zeigt alle Cafes, wo Produkt mit Name ‚Cola‘ existiert, aber Problem ist DJF Serializer

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

Sortimente und search_count zeigt alle Sortiment und Zählung davon, und berücksichtigt nicht suchen Argumente, was erwartet wird. Die Frage ist also - wie man Suchparameter an source = 'sortiment_set' weiterleitet (auch ich muss die Ergebnisse auf 3 beschränken) und wie man alle Suchergebnisse zählt. Ich habe versucht SerializerMethodField für Assrotments, es löst einen Teil meiner Probleme, aber es verursacht eine Menge von Abfragen. Override von get_field Methode hat die gleichen Probleme. Gibt es also eine Möglichkeit, Abfragefeld in ModelSerializer zu filtern und zu begrenzen und die Anzahl der unbegrenzten, aber gefilterten Abfragegruppen desselben Feldes zu erhalten?

+0

Können Sie auch die Ansicht bereitstellen, in der Sie filtern? –

+0

Sicher, Blick 'Klasse CafeAssortmentSearch (generics.ListAPIView): search_fields = ('assortment__product__name', 'assortment__product__category__name')' –

+0

und Serializer: 'Klasse CafeAssortmentSearchSerializer (serializers.ModelSerializer): "" "Suche Serializer für Sortiment Modell."“ " assortment_count = serializers.IntegerField (source = 'assortment_set.count') Sortimente = AssortmentListSerializer (source = 'assortment_set', viele = True) Klasse Meta: """ Meta-Klasse ""“ Modell. = models.Institution fields = ('id', 'name', 'assortments', 'sortiment_count') ' –

Antwort

0

Sie versuchen Sortiment Ressource über bekommen: /assortment/search/?search=cola so Ihre Antwort sollte nicht Cafe Ressourcen enthalten, sondern Sortiment Ressourcen wie folgt aus:

[ 
    { 
     '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 
    } 
] 

Sie sollten ein ListView für Assortment Modell mit einem AssortmentSerializer erstellen. Anstatt Cafe.objects.filter(assortment__product__name='cola') zu verwenden, verwenden Sie Assortment.objects.filter(product__name='cola') in Ihrer Suchansicht (Listenansicht).

+0

Ich weiß, aber das Problem ist, ich muss Suchergebnisse (Sortimente) von 3 und von caffee –

+0

gruppieren Sie können das Ergebnis in der Ansicht von Kaffee-ID und Sortimentsnummer gruppieren, bevor Sie das Ergebnis (implementieren Sie Ihre eigene Listenmethode), aber Die gewünschte Ausgabe ist nicht Restfull. –

Verwandte Themen