Сохранение изображения после манипуляции - PullRequest
0 голосов
/ 02 апреля 2020

У меня 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',)

Что я делаю не так?

...