У меня 2 модели. Один называется Choice
, а другой - ChoiceImage
.
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice = models.CharField(max_length=120)
class ChoiceImage(models.Model):
choice = models.OneToOneField(Choice, on_delete=models.CASCADE, null=True)
img = models.ImageField(upload_to='some-path/')
ChoiceImage
img
занимает ImageField. Если пользователь загружает одно поле изображения, то это изображение разрезается пополам, как показано с помощью этой функции:
def slice_image(img):
reader = misc.imread(img)
height, width, _ = reader.shape
with_cutoff = width // 2
s1 = reader[:, :with_cutoff]
s2 = reader[:, with_cutoff:]
misc.imsave(settings.MEDIA_ROOT + "/" + img.name, s1)
return ContentFile(np.ascontiguousarray(s2))
Первая половина изображения восстанавливается, а вторая половина изображения сохраняется для второго выбора. Вот как выглядит logi c:
class CreateChoiceSerializer(serializers.ModelSerializer):
choiceimage = ChoiceImageSerializer(many=False, required=False)
class Meta:
model = Choice
fields = ('choice', 'choiceimage')
def create(self, validated_data):
image_uploaded = validated_data.get("choiceimage")
if not image_uploaded["img"]:
q = validated_data.get("question")
if not q.choice_set.exists():
raise APIException("You must upload either an image or a cover.")
else:
img = q.choice_set.all()[0].choiceimage.img
img2 = slice_image(img)
validated_data["choiceimage"]["img"] = img2
image_validated_data = validated_data.pop('choiceimage')
choice = Choice.objects.create(**validated_data)
image_serializer = self.fields['choiceimage']
image_validated_data['choice'] = choice
image_serializer.create(image_validated_data)
Кажется, все работает нормально. Первое изображение разрезается пополам и сохраняется в папке мультимедиа, однако второе изображение не сохраняется и в базе данных путь img остается пустым. Странно, что создается запись, но путь к img пуст. Это значит, что это работает, но с изображением что-то не так. Я не уверен, что происходит.
Вот также ChoiceImageSerializer
:
class ChoiceImageSerializer(serializers.ModelSerializer):
img = Base64ImageField()
class Meta:
model = ChoiceImage
fields = ('img',)
Что я делаю не так?