Второе изображение не сохраняется с помощью сериализатора - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть 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)))
...