我想通过带有有效负载(例如{"image_url":"http://example.com/1.jpg"}
)的put调用而不是从文件而是从用户提交的url上传图像。
使用DRF进行此操作的推荐方法是什么?
(到目前为止,我唯一的选择是在模型视图集中手动重新实现所有功能。还有其他更好的解决方案吗?)
更新:
我的序列化器是:
class Person(models.Model):
image = models.ImageField() #...
class PersonSerializer(serializers.ModelSerializer):
image = serializers.ImageField(required=False)
class Meta:
model = Person
fields = ('image',)
答案 0 :(得分:0)
实际上需要将图像下载到服务器吗?您不仅可以将URL保存在CharField中,然后将其传递给客户端以供其浏览器下载吗? <img src="{{ your_model.image_url }}>"
。这样做可以节省服务器上的大量存储空间,并减轻此过程所需的许多安全检查,其中包括确保映像不会太大! 用户可以提供100GB的图像,这可能会使服务器崩溃。通过从Web URL下载图像并自己提供服务,您可以有效地托管已经在其他地方托管的图像。 / p>
但是,如果您希望下载图像,请使用基于python的HTTP请求库来下载图像。然后在模型中使用ImageField处理图像的存储和调用。 https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield
如果希望手动执行存储,则可以将文件保存在服务器上的文件夹中,然后在CharField中保存指向该文件的链接。尽管据我所知,这实际上是ImageField为您所做的。
答案 1 :(得分:0)
好吧,我最终要做的是在序列化时使用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.