Как поддержать необязательный или пустой FileField с Django Rest Framework? - PullRequest
0 голосов
/ 24 октября 2019

Я добавил новое FileField 'photo' в мою существующую модель и перенес базу данных. Когда я пытаюсь вернуть данные с помощью DRF, я получаю сообщение об ошибке «ValueError: Атрибут 'photo' не связан с файлом». Столбец фотографии содержит пустые значения.

Поле должно быть необязательным.

models.py:

def photo_directory_path(instance, filename):
    return 'photos/{0}/{1}'.format(instance.id, filename)

class MyModel(models.Model):
...
    photo = models.FileField(blank = True, editable = True, upload_to=photo_directory_path)
...

class MyModel_l10n(models.Model):
...
    mymodel = models.ForeignKey(MyModel, on_delete=models.CASCADE, related_name='%(class)s_mymodel')    
...

serializers.py:

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ['photo']

class MyModel_l10nSerializer(serializers.ModelSerializer):
    photo = serializers.ReadOnlyField(source='mymodel.photo', required = False, allow_null = True)

    class Meta:
        model = MyModel_l10n
        fields = ['photo', ...]

views.py:

    res = MyModel_l10n.objects.filter(...)
    serializer = MyModel_l10nSerializer(res, many=True)
    return Response (serializer.data)

сообщение об ошибке:

ValueError: The 'photo' attribute has no file associated with it.

РЕДАКТИРОВАТЬ: проблема сохраняется, я устанавливаю поля NULL = True и сделать столбец NULL. Кроме того, в том числе обязательный = False для сериализаторов. ReadOnlyField не помог.

Проблема возникает только с MyModel_l10n. Если я сериализую MyModel, отсутствующий файл не будет выпущен.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Изменение ReadOnlyField на FileField с обязательным = False, allow_null = True сделали свое дело.

0 голосов
/ 24 октября 2019

Ошибка, которую вы видите, возникает, когда поле фотографии не является нулевым, но не имеет основного файла в файловой системе. Я думаю, это может быть связано с тем, как вы определяете поле файла с помощью blank = True . После этого экземпляры модели сохраняются с пустым значением (не нулевым) в поле файла, и возникает исключение при попытке получить фактический файл, ассоциированный с этим полем.

Вместо этого вы можете попробовать определить свое поле следующим образом:

class MyModel(models.Model):
    ...
    photo = models.FileField(null = True, editable = True, upload_to=photo_directory_path)    
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...