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

Posted

技术标签:

【中文标题】Django/Tastypie - DELETE 请求删除所有内容【英文标题】:Django/Tastypie - DELETE requests deleting everything 【发布时间】:2014-06-05 21:25:53 【问题描述】:

我有以下型号

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

它只是删除该用户(在本例中为 id=2 的用户)的所有 Open 对象,而不是仅删除“名称”为 file_path 且“用户”为“/api/vi/”的 Open 对象用户/2/"

我错过了什么?

【问题讨论】:

【参考方案1】:

列表和细节的区别。

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 将忽略所有不应该出现的信息。

如果要过滤列表,请使用查询集参数:

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

【讨论】:

好吧,我的代码中确实有它,尽管我没有发布它。这就是为什么我不明白为什么会发生这种情况 那个 urlencode 不适合和 sweetpie 一起使用 很好的解释.....但是当我只想删除与补丁请求相同的特定字段数据时该怎么办会更新任何字段而不触及其他字段。我在 Mongonengine 中使用 Tastypie,所以我的模型中有一个 ListField,我可以使用补丁请求更新列表,但是我应该怎么做才能从 ListField 中删除任何项目。???以及当我的 MongoEngine 模型类中有多个 ListField 时该怎么办。

以上是关于Django/Tastypie - DELETE 请求删除所有内容的主要内容,如果未能解决你的问题,请参考以下文章

如何通知应用程序凭据在 Django/Tastypie/REST 中成功

Django Tastypie,运行一个动作

python Django Tastypie Geojson Serializer

Django/tastypie 实现中的 OAuth 2.0 客户端 ID

Django Tastypie:带有“空格”的反向 url。如何?

Django Tastypie 总是返回 401 未经授权