У меня есть модель (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