【问题标题】:How to support optional or empty FileField with Django Rest Framework?如何使用 Django Rest Framework 支持可选或空 FileField?
【发布时间】:2020-02-20 22:14:15
【问题描述】:

我在现有模型中添加了一个新的 FileField“照片”并迁移了数据库。当我尝试使用 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 并使列为空。 此外,在 serializers.ReadOnlyField 中包含 required = False 也无济于事。

这个问题只发生在 MyModel_l10n 上。如果我序列化 MyModel,则丢失的文件不是问题。

【问题讨论】:

  • FileField 不应该有null=True吗?
  • @radoh 我也测试过。

标签: django django-models django-rest-framework


【解决方案1】:

当照片字段不为空但文件系统上没有基础文件时,会引发您看到的错误。我认为这可能与您使用 blank=True 定义文件字段的方式有关。这样做后,您的模型实例将在文件字段上保存为空值(非 null),并在尝试获取与该字段关联的实际文件时引发异常。

您可以尝试像这样定义您的字段:

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

【讨论】:

  • 我也使用“null = True”进行了测试,并将字段设为空,但我收到了相同的错误消息。
  • 您是否在这样做后重新运行了迁移?
  • 如果是这种情况,该问题也可能与有问题的记录有关,可能是由于手动删除与 FileField 关联的文件引起的,或者可能与静默无法保存上传的问题有关文件。您能否检查所有 photo 字段不为空的实例在您的文件系统中是否存在相关文件?
  • Ozgur:是的,我运行了迁移。所有列都设置为空。
  • @tputkonen 您是否还可以检查文件系统中是否存在所有照片字段不为空的条目的关联文件?
【解决方案2】:

将 ReadOnlyField 更改为 FileField 并设置 required = False, allow_null=True 就可以了。

【讨论】:

    猜你喜欢
    • 2014-07-18
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 2016-01-09
    • 2011-08-21
    相关资源
    最近更新 更多