Я получаю ошибку типа при публикации данных с помощью REST. В нем говорится, что у меня может быть записываемое поле в классе сериализатора, которое не является допустимым аргументом - PullRequest
0 голосов
/ 20 июня 2020

полная ошибка:

Got a `TypeError` when calling `Certificate.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `Certificate.objects.create()`. You may need to make the field read-only, or override the CertificateSerializer.create() method to handle this correctly.

У меня есть модель сертификата, в которой есть методы clean () и get_remote_image (), поскольку есть два варианта публикации изображения в моей базе данных, либо с URL-адресами, либо с загрузкой файла - поэтому, когда один уже выбран, другой больше не нужен. если выбран вариант url, он сохраняется в поле изображения.

Я получаю сообщение об ошибке при публикации данных.

models.py

class Certificate(models.Model):
    certificate_name = models.CharField(max_length=50)
    template_img = models.ImageField(blank=True, default='', upload_to='certificate_templates')
    template_url = models.URLField(blank=True, default='')
    names_file = models.FileField(blank=True, default='', upload_to='names_files')
    names_csv = models.TextField(blank=True, default='')
    Y_RATIO = 1.6268

    def get_remote_image(self):
        if self.template_url and not self.template_img:
            img_result = requests.get(self.template_url)
            img_name = os.path.basename(self.template_url)
            with open(os.path.join(TEMP_DIR, img_name), 'wb') as img_file:
                img_file.write(img_result.content)
            self.template_img.save(
                img_name,
                open(os.path.join(TEMP_DIR, img_name), 'rb')
                )
            self.save()


    def clean(self):
        if not self.template_img and not self.template_url:
            raise ValidationError({'template_img': 'Either one of template_img or template_url should have a value.'})
        if not self.names_csv and not self.names_file:
            raise ValidationError({'names_csv': 'Either one of names_csv or names_file should have a value.'})


    def save(self):
        if self.template_url and not self.template_img:
            self.get_remote_image()
            super(Certificate, self).save()
        else:
            super(Certificate, self).save()

serializers.py

class CertificateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Certificate
        fields = ('certificate_name', 'template_img',
            'template_url', 'names_file', 'names_csv')

Я видел аналогичную проблему 1 & 2 , что метод сохранения не должен иметь аргументов, но у меня уже нет аргументов.

...