Python Django Tastypie使用补丁或PUT请求进行多对多(自我)字段更新?
我有这个模型:Python Django Tastypie使用补丁或PUT请求进行多对多(自我)字段更新?,python,django,api,rest,tastypie,Python,Django,Api,Rest,Tastypie,我有这个模型: class UserSub(models.Model): user = models.OneToOneField(User, related_name='userSub') amigos = models.ManyToManyField('self', null=True) title = models.TextField() 导入的Django用户模型 以及下列资源: class UserResource(ModelResource): use
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']
我正在尝试更新特定用户的amigos值。我的数据是:
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已接受”,并且不更新AMIGO
如果我在创建usersub时在第一个post请求中添加了amigos,它会成功地将它们添加到数据库中。但如果我使用PUT或PATCH向阵列添加更多内容,则不会更新。我不能确定这是否与您的情况相同,但我发现了我的问题 让我稍微修改一下您的示例,以反映我遇到的情况:
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/"] } }
在我的例子中,这个问题是由于试图修补嵌套在两层深处的ToMany资源,而父资源也存在于顶层的ToMany关系中。由于嵌套和资源上字段的顺序,操作顺序如下:
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/"] } }
显然这并不理想。如果我能想出一个更合适的解决方案,我会告诉您。这段实际代码有问题吗?还是这只是一个人为的例子?在您的示例中,有两件事我认为在本例中确实可以起作用:1)您直接修补UserSubResource,而不是UserResource。2) 我认为这个问题与嵌套的M2M在资源中多次出现有关,但是您的示例只有一个与ToManyField相关的字段。我正在处理同样的问题,寻找解决办法。