Переписывание функций ModelViewSet с двумя сериализаторами - PullRequest
0 голосов
/ 29 сентября 2019

EpisodeImage связан с внешним ключом для модели Episode.Итак, в Episode есть загрузка нескольких изображений.Но я запутался, как все это объединить в API.Согласно этому коду все в эпизодах работает нормально, но пользователь должен иметь возможность добавлять несколько изображений в эпизоде, поэтому я думаю, как это сделать, переопределив методы.Также должно быть два сериализатора, но я не думаю, как именно это сделать.Создание другой конечной точки - плохая идея, потому что во время создания эпизода пользователь также будет добавлять изображения.

models.py

class Episode(models.Model):
    ...
    story = models.ForeignKey(Story, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    episode_number = models.IntegerField(null=True)
class EpisodeImage(models.Model):
    episode = models.ForeignKey(Episode, related_name='images', on_delete=models.CASCADE)
    image = models.ImageField(upload_to=upload_location)

admin.py

class EpisodeImageInline(admin.TabularInline):
    model = EpisodeImage
    extra = 3
class EpisodeAdmin(admin.ModelAdmin):
    inlines = [EpisodeImageInline]
admin.site.register(Episode, EpisodeAdmin)

serializers.py

class EpisodeSerializer(serializers.ModelSerializer):
    story = serializers.IntegerField(source='story.id', read_only=True)

    class Meta:
        model = Episode
        fields = '__all__'
class EpisodeImageSerializer(serializers.ModelSerializer):
    episode = EpisodeSerializer(read_only=True)
    class Meta:
        model = EpisodeImage
        fields = '__all__'

views.py

class EpisodeView(viewsets.ModelViewSet):
    serializer_class = EpisodeSerializer

    def get_queryset(self):
        story_id = self.kwargs['story_id']
        return Episode.objects.filter(story=story_id)

    def perform_create(self, serializer):
        return serializer.save(story=story)

    def perform_update(self, serializer):
        return super(EpisodeView, self).perform_update(serializer)

    def perform_destroy(self, instance):
        return super(EpisodeView, self).perform_destroy(instance)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...