Django的Tastypie许多使用补丁或PUT请求很多(个体经营)字段更新?(Django Ta

2019-10-18 00:56发布

我有这样的模式:

class UserSub(models.Model):
    user = models.OneToOneField(User, related_name='userSub')
    amigos = models.ManyToManyField('self', null=True)
    title = models.TextField()

进口Django的用户模型。

而下面的资源:

class UserResource(ModelResource):
    usersub = fields.OneToOneField('test.api.UserSubResource', attribute = 'personal', related_name='user', full=True, null=True)    
    class Meta:
        object_class = User
        fields = ['username', 'first_name', 'last_name', 'password', 'email']
        detail_allowed_methods = ['get', 'post', 'put']
        authentication = Authentication()
        authorization = Authorization()
        queryset = User.objects.all()
        resource_name = 'users'
        excludes = ['id']

class UserSubResource(ModelResource):
    user = fields.OneToOneField('test.api.UserResource', attribute = 'user', related_name = 'userSub')
    amigos= fields.ToManyField('test.api.UserSubResource', attribute = 'amigos', null=True)      
    class Meta:
        object_class = UserSub
        fields = ['title']
        detail_allowed_methods = ['get', 'post', 'put', 'patch']
        authentication = Authentication()
        authorization = Authorization()
        always_return_data = True
        queryset = UserSub.objects.all()
        resource_name = 'usersub'
        excludes = ['id'] 

我想吾友特定用户的值更新。 我的数据是:

usersub_json: {"amigos":["/api/v1/usersub/9/","/api/v1/usersub/8/"]}

$.ajax({
        url : 'http://127.0.0.1:8000' + usersub_uri,
                        type : 'PUT',
                        contentType : 'application/json',
                        data : usersub_json,
                        dataType : 'json',
                        processData : false,
                        error : function(http) {
                            if (http.responseText != "") {
                                alert(http.responseText);
                            }
                        }
                    })

我从PUT请求获得“202接受 ”,而不是更新的吾友。

“202接受 ”从PATCH请求,戈斯不作更新。

如果我创建一个USERSUB当在第一篇文章的请求添加吾友,这将它们添加到数据库中成功。 但是,如果我增加更多的使用PUT或PATCH阵列未更新。

Answer 1:

我不能肯定它是与您的情况,但我发现我的问题。

让我修改你的例子稍微反映我所遇到的情况:

class UserResource(ModelResource):
    usersubs = fields.ToManyField('test.api.UserSubResource', attribute = 'usersubs', full=True, null=True)
    specialUsersub = fields.ToOneField('test.api.UserSubResource', attribute = 'special_user_sub', full=True, null=True) 
    class Meta:
        object_class = User
        fields = ['username', 'first_name', 'last_name', 'password', 'email']
        detail_allowed_methods = ['get', 'post', 'put']
        authentication = Authentication()
        authorization = Authorization()
        queryset = User.objects.all()
        resource_name = 'users'
        excludes = ['id']

class UserSubResource(ModelResource):
    amigos= fields.ToManyField('test.api.UserSubResource', attribute = 'amigos', null=True)      
    class Meta:
        object_class = UserSub
        fields = ['title']
        detail_allowed_methods = ['get', 'post', 'put', 'patch']
        authentication = Authentication()
        authorization = Authorization()
        always_return_data = True
        queryset = UserSub.objects.all()
        resource_name = 'usersub'
        excludes = ['id']

并要求:

PATCH /users/1/
{ "specialusersub" : { "id" : 3, "amigos" : ["/api/v1/usersub/9/","/api/v1/usersub/8/"] } }

在我的情况下,这个问题是由试图修补嵌套深两级当父资源在顶层的一对多的关系,也存在一个一对多的资源引起的。 因为因为在资源领域的秩序的嵌套的,操作的顺序发生这样的:

  1. 水合物usersubs成束(及其嵌套关系 - 从数据库加载,在我们的情况下空)
  2. 水合物specialUsersub成束(及其嵌套关系 - 包含在请求数据)
  3. 保存specialUsersub(嵌套资源正确地保存在这里)
  4. [此时tastypie应检查是否有其水合资源被保存和补充水分束的适当片,但它没有,所以:]
  5. 保存usersubs(如果specialUsersub的资源也存在于usersubs当时被以前保存将在usersubs在步骤1中水合载入的陈旧数据覆盖)

为了更准确,因为tastypie与存储的内容在束重新填充之前故意清除所有M2M关系,陈旧的数据则会覆盖新的数据,在3中创建的吾友被删除,并与在1加载[]空表替换。

我还在测试,但我认为解决的办法/黑客是确保您有更新的嵌套的资源等。无论您tastypie资源可能期待它:

PATCH /users/1/
{ "usersubs" : [{ "id" : 3, "amigos" : ["/api/v1/usersub/9/","/api/v1/usersub/8/"] }], "specialusersub" : { "id" : 3, "amigos" : ["/api/v1/usersub/9/","/api/v1/usersub/8/"] } }

显然,这并不理想。 我会让你知道,如果我拿出一个更合适的解决方案。



文章来源: Django Tastypie Many to Many (self) field update using a PATCH or PUT request?