Django Rest框架+ EmberJS文件上传更新(补丁)

时间:2015-05-27 14:36:20

标签: django ember.js ember-data django-rest-framework

我有一个这样的模型:

// 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表示为字符串而不是因为文件服务器返回错误。

据我所知,这种情况可能会有一些解决方法:

  1. 第一个是创建自定义serializers.CustomFileField,它会检查提供的string是否等于输出上序列化程序生成的url,以及它是否保持文件完整。< / LI>
  2. 第二个选项是以某种方式在ember方面实现快速而肮脏的patch,根据This Link,据我所知仍然处于开发阶段。但是这个选项似乎很难,因为我有很多带有文件字段的模型,我应该在ember中为每一个实现patch方法。
  3. 我认为第三个选项就是创建一个特殊的File模型:

    // models.py class File(models.Model):     filebody = models.FileField(upload_to ='/ files /')

  4. 并在MyModel myfilefield上设置read_only,以便它不会随时验证。我还可以在File模型上实现一些方法来接收该文件真正属于的模型和实例,并在上传和验证之后生成myfilefield = filebody 这个方法看起来也很脏,但至少保留了一些概念摘要,所以我不需要担心我的项目中有FileFields实际拥有多少个模型。

    我的用户界面要求用户一次更改一个模型字段,然后保存模型 - 即 1.更改名称字段,保存模型 2.更改布尔字段,保存模型。 3.上传文件,保存模型。

    考虑到ember仍然不支持PATCH请求的事实,任何有关django休息的最佳方式的建议都可以实现这一点。

0 个答案:

没有答案