2

Ich bin ein Produktmodell und seine Kommentare serialisieren. Hier ist mein einfacher Code:In Django Rest Framework, wie die Anzahl der Fremdschlüsselobjekte begrenzt werden, die serialisiert werden

class ProductSerializer(serializers.HyperlinkedModelSerializer): 
    comment_set = CommentSerializer(many=True, read_only=True) 
    class Meta: 
     model = Product 
     fields = [ 
      'title', 
      'comment_set' 
     ] 


class CommentSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Comment 
     fields = [ 
      'text', 
     ] 


class Comment(models.Model): 
    product = models.ForeignKey(Product, null=True, blank=True, db_index=True) 


class Product(models.Model): 
    title = models.CharField(max_length=50) 
    ... 

Problem: Wenn das Produkt viele Kommentare. Zum Beispiel 500 Kommentare. Alle 500 von ihnen wurden serialisiert.

Wie kann ich das Ergebnis auf eine Anzahl meiner eigenen Wahl beschränken, wie 100 Kommentare?

Ich habe ein paar Nachforschungen gemacht, bevor ich das gepostet habe, habe aber nur Fragen zum Filtern gefunden.

Vielen Dank.

+0

http://www.django-rest-framework.org/api-guide/pagination/ –

Antwort

2

Sie möchten an dem CommentSerializer-Abfrage-Set arbeiten, um zu steuern, welche Sie behalten.

Sie können dies tun, indem Sie get_queryset überschreiben. Zum Beispiel, um sie gegen den aktuellen Benutzer zu filtern. Beachten Sie, dass ich dieses Beispiel nahm, weil es zeigt, wie die Anforderung des Kontext verwenden, um Filter gegen:

class CommentSerializer(serializers.HyperlinkedModelSerializer): 
    def get_queryset(self): 
     user = self.context['request'].user 
     queryset = Comment.objects.filter(user=user) 
     return queryset 

    class Meta: 
     model = Comment 
     fields = [ 
      'text', 
     ] 
+0

Dank. Funktioniert perfekt und danke für den Hinweis auf den Anfragekontext. Danke auch für andere Antworten, obwohl ich deine Lösungen noch nicht getestet habe. Aber sie sollten auch funktionieren. – Kakyoin

4

Definieren Sie eine neue Methode für das Modell , das eine Abfrage mit einer begrenzten Anzahl von Kommentaren zurückgibt.

Dann übergeben Sie diese Methode als die Quelle der CommentSerializer innerhalb Ihrer .

class Product(models.Model): 
    title = models.CharField(max_length=50) 


    def less_comments(self): 
     return Comment.objects.all().filter(product=self).order_by("-id")[:100] 

Dann in der ProductSerializer:

class ProductSerializer(serializers.HyperlinkedModelSerializer): 
    comment_set = CommentSerializer(many=True, read_only=True, source="less_comments") 

PS: Schrieb die Codes aus dem Speicher, habe sie nicht getestet werden. Aber sollte funktionieren.

3

Sie können benutzerdefinierte ListSerializer und setzen in CommentSerializer schreiben, dann benutzerdefinierte Feld in ProductSerializer, wich Quelle auf Standardbezogenen Namen erstellen basiert:

class LimitedListSerializer(serializers.ListSerializer): 

    def to_representation(self, data): 
     data = data.all()[:100] 
     return super(FilteredListSerializer, self).to_representation(data) 

class CommentSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
      list_serializer_class = LimitedListSerializer 
      model = Comment 
      fields = [ 
       'text',] 

class Product(serializers.HyperlinkedModelSerializer): 
    related_comments = CommentSerializer(many=True, read_only=True, source='comment_set') 

wenn Sie many=True, Liste serrializer genannt wird passieren.