2017-06-01 6 views
0

ich mit Serializer gerade arbeitete, wie durch den Link beschrieben: Serializer relations (section PrimaryKeyRelatedField)Django Rest: Serializer Basierend auf mehreren Queryset

Ich habe einen etwas anderen Bedarf, ich bin sicher, dass es wirklich einfach ist.

class Album(models.Model): 
    album_name = models.CharField(max_length=100) 
    artist = models.CharField(max_length=100) 

class Track(models.Model): 
    album = models.ForeignKey(Album, related_name='tracks') 
    order = models.IntegerField() 
    title = models.CharField(max_length=100) 
    duration = models.IntegerField() 

class SomeWidget(models.Model): 
    album = models.ForeignKey(Album) 
    track = models.ForeignKey(Track) 
    name = models.CharField(max_length=100) 
    description = models.CharField(max_length=100) 

Mein Bedürfnis, ich brauche Folgendes zurück:

{ 
    'album_name': 'Things We Lost In The Fire', 
    'artist': 'Low', 
    'tracks': [ 
     '1: Sunflower', 
     '2: Whitetail', 
     '3: Dinosaur Act', 
     ... 
    ], 
    'widget': [ 
     { 
      'id': '1234', 
      'name': 'my widget', 
      'description': 'my description' 
     } 
    ] 
} 

Ich versuche:

class WidgetField(serializers.RelatedField): 
    def to_representation(self, value): 
     return { 
      'id': '1234' 
      .... 
     } 


class TrackListingField(serializers.RelatedField): 
    def to_representation(self, value): 
     ... 

class AlbumSerializer(serializers.ModelSerializer): 
    tracks = TrackListingField(many=True) 
    widget = WidgetField() 

    class Meta: 
     model = Album 
     fields = ('album_name', 'artist', 'tracks') 

Ich erhalte die Fehlermeldung:

AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`. 

Dank

Antwort

0

Ok, verstanden. Es brauchte ein bisschen Googeln/Versuch und Irrtum. Anscheinend können Sie die Funktion überschreiben, die Daten für das Feld zurückgibt.

Zum Beispiel:

class AlbumSerializer(serializers.ModelSerializer): 
    widget = serializers.SerializerMethodField() 

    def get_widget(self, data): 
     return { 
      'id': data.id 
     } 

OR, können Sie Folgendes tun:

class WidgetSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Widget 
     fields = ('id', 'name', 'description',) 

.... und in der AlbumSerializer.get_widget Funktion:

def get_widget(self, data): 
     widget = Widget.objects.get(album=data.album, track=data.track) 
     return WidgetSerializer(widget, many=False, context=self.context).data 

Schließlich Sie haben keine , um den Funktionsnamen "get_widget" zu verwenden. Sie können es nennen, was Sie wollen. Beispiel:

class AlbumSerializer(serializers.ModelSerializer): 
    widget = serializers.SerializerMethodField("fn_override") 

    def fn_override(self, data): 
     .... 

Sie das Muster in dieser Frage SO folgen: Django REST Framework: adding additional field to ModelSerializer

Verwandte Themen