簡體   English   中英

如何在django-rest-framework中通過關系使用ManytoManyField

[英]How to work with ManytoManyField with through relation in django-rest-framework

基本上我有這樣的模型:

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)

現在我想要一個API來返回這樣的PLAYLISTS ...但是視頻應該按PlaylistVideo模型中的POSITION排序

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

我該怎么辦呢?

不太確定你是否已經設法解決了你的問題,但我自己也遇到過這個問題,並設法讓它像這樣做:

創建一個這樣的自定義序列化器:

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

在這里,我假設你想顯示視頻實體/表格下的所有字段。 隨意調整您的需求/喜好。

然后,你需要做的就是這個

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

注意:始終確保源引用關聯實體。 否則你會得到一個空的json列表。

希望這可以幫助那些面臨類似問題的人。

你可以這樣做:

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

在serializers.py中:

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

我們需要真正添加一些關於“通過”關系的文檔。

與此同時,這個討論可能會有所幫助:

https://groups.google.com/forum/#!topic/django-rest-framework/xzOhjILq3xA/discussion

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM