我有以下型号
class Open(models.Model):
name=models.TextField()
opened=models.DateTimeField(auto_now_add=True)
user=models.ForeignKey(User)
以及以下资源
class UserResource(ModelResource):
class Meta:
queryset = User.objects.all()
resource_name = 'user'
class OpenResource(ModelResource):
user = fields.ForeignKey(UserResource,'user')
class Meta:
queryset = Open.objects.all()
resource_name = 'open'
我正在尝试从某个用户的open_set中删除一个Open对象。 对于发布,我使用以下代码(使用请求):
content={"name":file_path,
"user":"/api/v1/user/2/"}
requests.post(
url='http://localhost:8000/api/v1/open/',
data=json.dumps(content),
headers={'content-type':'application/json'},
)
完美无缺,完全符合我的要求。 但是,在尝试使用类似代码进行删除时:
content={"name":file_path,
"user":"/api/v1/user/2/"}
requests.delete(
url='http://localhost:8000/api/v1/open/',
data=json.dumps(content),
headers={'content-type':'application/json'},
)
它只删除该用户的所有Open对象(在本例中为id = 2的用户),而不是仅删除“name”为file_path且其“user”为“/ api / vi /”的Open对象用户/ 2 /“
我错过了什么?
答案 0 :(得分:3)
RESTful方法分为两种:
详细信息(用于GET,PUT和DELETE):
/api/v1/objects/1/
和列表(用于GET,PUT和DELETE):
/api/v1/objects/
POST和PATCH有点不同。
表示DELETE /api/v1/objects/
将删除所有对象。
要删除一个对象,您必须提供带id的路径:
DELETE /api/v1/objects/1/
你不能只是在内容中添加内容并希望被Tastypie选中。 Tastypie将忽略所有不存在的信息。
如果要过滤列表,请使用queryset参数:
/api/v1/objects/?name=asdfasdf&user=2
并允许过滤这些:
from tastypie.constants import ALL, ALL_WITH_RELATIONS
class Open(models.Model):
name=models.TextField()
opened=models.DateTimeField(auto_now_add=True)
user=models.ForeignKey(User)
filtering = {'name': ALL, 'user': ALL_WITH_RELATIONS}
完成这些更改后,您将能够删除一组对象:
DELETE /api/v1/objects/?name=asdfasdf&user=5
所以你的电话会是这样的:
import urllib
content={"name":file_path,
"user":"/api/v1/user/2/"} # If doesn't work change '/api/v1/user/2/' into 2 I am not sure about this
url = 'http://localhost:8000/api/v1/open/?' + urllib.urlencode(content)
requests.delete(
url=url,
data=None,
headers={'content-type':'application/json'},
)