Как создать сериализатор Django Rest Framework со многими полями? - PullRequest
0 голосов
/ 08 января 2020

У меня есть модель (Project), которая содержит ManyToManyField для другой модели (Снимок экрана). Я хочу создать представление, наследующее CreateAPIView, чтобы оно могло сериализовать данные для создания экземпляра модели проекта, включая модель Снимок экрана из того же представления.

models.py

class Screenshot(models.Model):
    image = models.ImageField(default='screenshots.jpg',upload_to='screenshots')


class Project(models.Model):
    team=models.ForeignKey(Team,on_delete=models.CASCADE)
    name=models.CharField(max_length=100,null=True,blank=True)
    theme = models.ForeignKey(Theme,on_delete=models.CASCADE,null=True,blank=True)
    desc=models.TextField()
    accepted = models.BooleanField(default=False)
    git_url=models.URLField(null=True,blank=True)
    youtube_url=models.URLField(null=True,blank=True)
    screenshots=models.ManyToManyField(Screenshot)

serializers.py

class ScreenshotCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Screenshot
        fields=['image']   


class ProjectCreateSerializer(serializers.ModelSerializer):
    image_1 = ScreenshotCreateSerializer()
    image_2 = ScreenshotCreateSerializer()
    image_3 = ScreenshotCreateSerializer()
    image_4 = ScreenshotCreateSerializer()
    image_5 = ScreenshotCreateSerializer()

    class Meta:
        model = Project
        fields = ['name','theme','desc','git_url','youtube_url','image_1','image_2','image_3','image_4','image_5']

    def create(self,validated_data):
        try:
            image1 = validated_data.pop('image_1')
            image2 = validated_data.pop('image_2')
            image3 = validated_data.pop('image_3')
            image4 = validated_data.pop('image_4')
            image5 = validated_data.pop('image_5')
        except:
            pass
        print(validated_data)
        test_team_obj = Team.objects.all()[0]
        project_obj = Project(**validated_data)
        project_obj.team = test_team_obj
        project_obj.save()

        if (image1):
            project_obj.screenshots.create(image=image1.get('image'))
        if (image2):
            project_obj.screenshots.create(image=image2.get('image'))
        if (image3):
            project_obj.screenshots.create(image=image3.get('image'))
        if (image3):
            project_obj.screenshots.create(image=image4.get('image'))
        if (image4):
            project_obj.screenshots.create(image=image5.get('image'))

        return project_obj

Форма отображается, как ожидается, с 5 поля изображения. После отправки формы создается необходимый экземпляр проекта, также создаются экземпляры снимков экрана, и только что созданные экземпляры снимков экрана связываются с только что созданным экземпляром проекта. Все хорошо работает. Но возникает ошибка:

Получил AttributeError при попытке получить значение для поля image_1 на сериализаторе ProjectCreateSerializer. Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре Project. Исходный текст исключения: объект «Проект» не имеет атрибута «image_1».

Независимо от ошибки, данные в базе данных корректно обновляются по желанию. Но ошибка в том, что меня убивает! Я даже попытался использовать одно поле изображения вместо 5 и поставить many=True, но там написано:

Списки в настоящее время не поддерживаются при вводе HTML

...