【问题标题】:Django/Tastypie - DELETE requests deleting everythingDjango/Tastypie - DELETE 请求删除所有内容
【发布时间】: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/"

我错过了什么?

【问题讨论】:

    标签: python json django python-2.7 tastypie


    【解决方案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 时该怎么办。
    猜你喜欢
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    相关资源
    最近更新 更多