2012-12-25 8 views
19

Zasadniczo mam modele tak:Jak pracować z ManyToManyField z pośrednictwem relacji w django-Rest-ram

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) 

Teraz chcę API powrócić PLAYLIST tak ... Ale Filmy powinny być klasyfikowane według Pozycja w PlaylistVideo modelu

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

Jak dostałem ten temat?

Odpowiedz

4

Można to zrobić tak:

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

w serializers.py:

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

Niezbyt na pewno, jeśli udało Ci się rozwiązać swój problem, ale natknąłem się na to jaźń, i udało się zrobić to praca jak robiąc coś takiego:

tworzyć niestandardowe serializatora tak:

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

tu jestem zakładając chcesz wyświetlić wszystkie pola pod filmy encja/tabela. Zapraszam do dostosowania się do Twoich potrzeb/upodobań.

Następnie wszystko co musisz zrobić to

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

Uwaga: Zawsze upewnij się, że źródło jest odniesienie do asocjacyjnej podmiotu. W przeciwnym razie otrzymasz listę pustych jsonów.

Mam nadzieję, że pomogłoby to każdemu, kto znalazłby się w podobnej sytuacji.

+0

Jakieś pomysły dotyczące modyfikacji, jeśli chcesz móc tworzyć i/lub aktualizować filmy wideo za pomocą list odtwarzania? Wygląda na to, że nie działa z tą konfiguracją. – getup8

+0

Odpowiedziałem na moje własne pytanie. Potrzebujesz własnych metod tworzenia i aktualizowania i musisz używać nie-ReadOnlyFields. – getup8