我有这样的模式:Django Tastypie使用PATCH或PUT请求进行多对多(自)字段更新?
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);
}
}
})
我得到“202接受”从PUT请求,并且不更新吾友。
和“202接受”来自PATCH请求,并且amigos不更新。
如果我在创建usersub时在第一个发布请求中添加了amigos,它会成功将它们添加到数据库中。但如果使用PUT或PATCH将更多数据添加到阵列,则不会更新。
您是否遇到此实际代码的问题?或者这只是一个人为的例子?在你的例子中有几件事情,我认为它会在这种情况下实际工作:1)你直接修补UserSubResource而不是UserResource。 2)我认为这个问题与嵌套的M2M在资源中多次出现有关,但您的示例只有一个相关的ToManyField。我正在处理同样的问题并寻找解决方案。 – kball