我想上传的图片不是来自文件,而是来自用户提交的网址,通过使用{"image_url":"http://example.com/1.jpg"}
等有效负载的put调用。
使用DRF建议的方法是什么?
(到目前为止,我唯一的选择是在我的模型视图集中手动重新实现所有内容。还有更好的解决方案吗?)
更新:
我的序列化器是:
class Person(models.Model):
image = models.ImageField() #...
class PersonSerializer(serializers.ModelSerializer):
image = serializers.ImageField(required=False)
class Meta:
model = Person
fields = ('image',)
图像是否确实需要下载到服务器?您是否可以将URL保存在CharField中并将其传递到客户端以供其浏览器下载? <img src="{{ your_model.image_url }}>"
。这样做可以节省服务器上的大量存储空间,并减轻此过程所需的许多安全检查,包括确保图像不会太大!用户可以提供100GB的图像,这可能会使服务器崩溃。通过从Web URL下载图像并自行提供,您可以有效地托管已在其他地方托管的图像。
但是,如果您确实希望下载图像,请使用基于python的HTTP请求库来下载图像。然后在模型中使用ImageField来处理图像的存储和调用。 https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield
如果您希望手动执行存储,可以将文件保存在服务器上的文件夹中,然后在CharField中保存指向此文件的链接。虽然据我所知,这基本上是ImageField为你做的事情。
好吧,我最终做的是在序列化中使用URLField
。
class Person(models.Model):
image = models.ImageField()
class PersonSerializer(serializers.ModelSerializer):
image = serializers.URLField()
# with a custom field serializer it is possible
# to make this field behave both as URLField (handling links)
# and as ImageField (handling files)
class Meta:
model = Person
fields = ('image',)
def save(self):
# handles the upload if the image url is external.