我有一个这样的模型:
// models.py
class MyModel(models.Model):
name = models.CharField(max_length=30, null=True, blank=True)
someboolean = models.BooleanField(default=False)
someotherBoolean = models.BooleanField(default=False)
myfilefield = models.FileField(upload_to='/files/')
然后我有一个像这样的序列化器:
// serializers.py
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
然后我有一个继承自RetrieveUpdateDestroyAPIView
这个Django Rest设置连接到EmberJS并且运行正常。来自服务器的数据没有任何问题,并且myfilefield
内容在ember中表示为string
,它是实际文件的URL。当我想到将文件上传到Django Rest一侧的字段时,似乎我必须使用FileUploadParser进行一些操作以使其正确,我认为这不是更多的代码行。
但问题是我在Ember方面的模型应该部分更新。有时我需要仅更新someboolean
的值,并且不要将任何文件发送到myfilefield
,因为文件已经存在,或者因为这是在其他UI迭代(单独)中完成的。在Ember中,在对this.get('model').save();
进行一些更改后调用someboolean
它会将整个模型数据发送回django rest,并且此json请求中的myfilefield
表示为字符串而不是因为文件服务器返回错误。
据我所知,这种情况可能会有一些解决方法:
serializers.CustomFileField
,它会检查提供的string
是否等于输出上序列化程序生成的url,以及它是否保持文件完整。< / LI>
patch
,根据This Link,据我所知仍然处于开发阶段。但是这个选项似乎很难,因为我有很多带有文件字段的模型,我应该在ember中为每一个实现patch
方法。我认为第三个选项就是创建一个特殊的File
模型:
// models.py class File(models.Model): filebody = models.FileField(upload_to ='/ files /')
并在MyModel myfilefield
上设置read_only
,以便它不会随时验证。我还可以在File
模型上实现一些方法来接收该文件真正属于的模型和实例,并在上传和验证之后生成myfilefield = filebody
这个方法看起来也很脏,但至少保留了一些概念摘要,所以我不需要担心我的项目中有FileFields
实际拥有多少个模型。
我的用户界面要求用户一次更改一个模型字段,然后保存模型 - 即 1.更改名称字段,保存模型 2.更改布尔字段,保存模型。 3.上传文件,保存模型。
考虑到ember仍然不支持PATCH
请求的事实,任何有关django休息的最佳方式的建议都可以实现这一点。