Как работать с ManytoManyField с помощью отношений в 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, как это... Но видео следует сортировать по POSITION в
ПлейлистВидео модель
{
"key": "h8x3",
"title": "First Playlist",
"pub_date": "2012-10-11T17:00:26Z",
"videos": [
{
....
},
{
....
}
]
},
Как мне это узнать?
Ответы
Ответ 1
Не слишком уверен, что вам удалось решить вашу проблему, но я наткнулся на это сам и сумел заставить ее работать, например, сделав что-то вроде этого:
создайте собственный сериализатор следующим образом:
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.
Надеюсь, это поможет любому, кто сталкивается с подобной проблемой.
Ответ 2
Вы можете сделать это следующим образом:
class PlaylistVideoList(generics.ListCreateAPIView):
serializer_class = PlaylistVideoSerializer
queryset = PlaylistVideo.objects.all().order_by('position')
в serializers.py:
class PlaylistVideoSerializer(serializers.ModelSerializer):
class Meta:
model = PlaylistVideo
Ответ 3
Нам нужно добавить некоторую документацию по "сквозным" отношениям.
Тем временем это обсуждение может помочь:
https://groups.google.com/forum/#!topic/django-rest-framework/xzOhjILq3xA/discussion