2012-12-25 7 views
19

Grundsätzlich mit ManyToManyField arbeiten:Wie mit durchgehender Beziehung in django-Rest-Rahmen

class Playlist(models.Model): 
    key = models.CharField(max_length=255,blank=True, unique=True) 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=200) 
    pub_date = models.DateTimeField(auto_now_add=True) 
    videos = models.ManyToManyField(Video, through='PlaylistVideo') 

class PlaylistVideo(models.Model): 
    playlist = models.ForeignKey(Playlist) 
    video = models.ForeignKey(Video) 
    position = models.IntegerField() 

class Video(models.Model): 
    title = models.CharField(max_length=255,blank=True) 
    description = models.TextField(blank=True) 
    thumb = models.URLField(blank=True) 
    duration = models.IntegerField(default=0) 

Jetzt möchte ich eine API PLAYLISTEN wie diese zurückkehren ... Aber Videos sollten sortiert werden POSITION in PlaylistVideo Modell

{ 
     "key": "h8x3", 
     "title": "First Playlist", 
     "pub_date": "2012-10-11T17:00:26Z", 
     "videos": [ 
      { 
       .... 
      }, 
      { 
       .... 
      } 
     ] 
    }, 

Wie soll ich es bekam?

Antwort

4

Sie es wie folgt tun:

class PlaylistVideoList(generics.ListCreateAPIView): 
    serializer_class = PlaylistVideoSerializer 
    queryset = PlaylistVideo.objects.all().order_by('position') 

in serializers.py:

class PlaylistVideoSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = PlaylistVideo 
7

Nicht zu sicher, wenn es Ihnen gelungen ist, Ihr Problem zu lösen, aber ich bin auf dieses Problem gestoßen Selbst, und schaffte es, es wie durch so etwas wie dies funktioniert tun:

einen benutzerdefinierten Serializer wie folgt erstellen:

class PlaylistVideoSerializer(serializers.HyperlinkedModelSerializer): 
    title = serializers.ReadOnlyField(video.title) 
    description = serializers.ReadOnlyField(video.description) 
    thumb = serializers.ReadOnlyField(video.thumb) 
    duration = serializers.ReadOnlyField(video.duration) 

    class Meta: 
     # your associative entity here 
     model = PlaylistVideo 
     fields = ('title', 'description', 'thumb', 'duration') 

Hier, ich nehme an, Sie alle Felder unter Videos anzeigen mögen Entität/Tabelle Fühlen Sie sich frei, sich an Ihre Bedürfnisse/Wünsche anzupassen.

Dann alles, was Sie tun müssen, ist diese

class PlaylistSerializer(serializers.ModelSerializer): 
    videos = PlaylistVideoSerializer(source='playlistvideo_set', many=True) 
    class Meta: 
     model = Playlist 
     fields = ('key', 'title', 'pub_dates', 'videos') 

Hinweis: Vergewissern Sie sich, dass die Quelle auf die assoziative Entität verweist. Sonst würdest du eine Liste von leeren JSons bekommen.

Ich hoffe, dies würde jedem da draußen mit ähnlichen Problem helfen.

+0

Irgendwelche Ideen, wie Sie ändern können, wenn Sie Videos über Wiedergabelisten erstellen und/oder aktualisieren möchten? Es scheint nicht mit dieser Einrichtung zu funktionieren. – getup8

+0

beantwortete meine eigene Frage. Sie benötigen eigene Methoden zum Erstellen und Aktualisieren, und Sie müssen Nicht-ReadOnlyFields verwenden. – getup8

Verwandte Themen