Django / Tastypie - DELETE请求删除所有内容

时间:2014-04-21 18:47:48

标签: python json django python-2.7 tastypie

我有以下型号

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 /“

我错过了什么?

1 个答案:

答案 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/

Link to documentation

过滤在Tastypie中的工作原理:

你不能只是在内容中添加内容并希望被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

Link to documentation

编辑:

所以你的电话会是这样的:

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'},
)