У меня есть 2 модели, которые выглядят так:
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
, который выглядит следующим образом:
class ChoiceImageSerializer(serializers.ModelSerializer):
img = Base64ImageField()
class Meta:
model = ChoiceImage
fields = ('img',)
И ChoiceSerializer
, который выглядит как это:
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)
По сути, цель заключается в следующем: пользователь создает 2 варианта. Если пользователь не предоставляет изображение для выбора, верните ошибку. Иначе, если пользователь предоставляет только одно изображение, разделите изображение пополам. Сохраните одну половину первого выбора, а вторую половину второго выбора. Наконец, если загружены два изображения, игнорируйте разделенное изображение logi c. Моя логика c отлично работает без изображения и двух изображений.
Однако, когда я отправляю только одно изображение, изображение разрезается пополам, и при первом выборе это изображение сохраняется в базе данных и путь к файлу правильно , но когда он пытается сохранить изображение второго выбора, он создает выбор и запись ChoiceImage
, но путь к этому изображению пуст и изображение не сохраняется в пути к файлу. Я не уверен, почему это происходит, потому что я не получаю никакой ошибки вообще. Что я делаю не так?
Вот моя функция разделения изображения:
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(base64.b64encode(np.ascontiguousarray(s2)))