我有這樣的模式: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