Создание изображения с внешним ключом к экземпляру модели не возвращает URL изображения в serializer.data
У меня есть две модели, которые связаны через внешний ключ. Статья может иметь 0, 1 или много изображений. И height_field
и width_field
вычисляются автоматически. is_title_image
задается в запросе POST
.
class Article(models.Model):
slug = models.SlugField(null=True, default=None, unique=True, max_length=255)
heading = models.CharField(max_length=2550)
summary = models.CharField(max_length=25500)
class Image1(models.Model):
height_field=models.PositiveIntegerField(default=0)
width_field=models.PositiveIntegerField(default=0)
file = models.ImageField(storage=PublicMediaStorage(), height_field='height_field', width_field='width_field')
is_title_image = models.BooleanField(default=False)
article = models.ForeignKey(Article, related_name='images', null=True, on_delete=models.DO_NOTHING)
Сначала я создаю статью в DraggableArticleSerializer
и использую pk
для создания images
. Здесь я не уверен, что это оптимальный способ. Я использую ImageSerializer
для получения всех полей из экземпляра изображения. Статья и изображение правильно создаются в базе данных. Но я не могу использовать эти данные в views.py
, чтобы вернуть их на фронтенд. Свойство images
в serializer.data
пусто, а serializer.validated_data
просто возвращает входные данные InMemoryUploadedFile
:
serializer.validated_data['images'][0]['file']
возвращает OrderedDict([('file', <InMemoryUploadedFile: husky4.jpg (image/jpeg)>), ('is_title_image', True)])
Я не знаю, как мое представление должно быть изменено по сравнению с обычным CreateAPIView. Должен ли я предоставить какие-то дополнительные данные в serializer.save()
или моя проблема находится где-то еще.
class DraggableArticleSerializer(serializers.ModelSerializer):
images = ImageSerializer(many=True, required=False)
class Meta:
model = Article
fields = (
"slug",
"heading",
"summary",
)
def create(self, validated_data):
image_data=validated_data.pop("images")
article = Article.objects.create(**validated_data)
for image_entry in image_data:
image_inputs = data={"file": image_entry['file'], "is_title_image":
image_entry['is_title_image'], "article": article.pk}
serializer = ImageSerializer(data=image_inputs, context=self.context)
if serializer.is_valid():
serializer.save()
return article
class ImageSerializer(serializers.ModelSerializer):
file = serializers.FileField( max_length=100000,
allow_empty_file=False)
fields = (
"pk",
"file",
"get_absolute_url",
"url",
"height_field",
"width_field",
"is_title_image",
)