【问题标题】:Django filtering and deletingDjango过滤和删除
【发布时间】:2014-07-08 03:29:07
【问题描述】:

我有这个模型视图集

class LikeViewSet(viewsets.ModelViewSet):
    queryset = Likes.objects.all()
    serializer_class = LikeSerializer
    filter_fields = ('user','post')

    def delete(self, request, pk, format=None):
        post = Likes.objects.get(pk=pk)
        post.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

我正在尝试使用以下网址进行过滤,例如:

http://localhost:8000/likes/?user=anon&post=1

然后删除我从 django 获得的特定结果,但 django 不断给我

delete() takes at least 3 arguments (2 given)

我真的不知道为什么。有人可以帮忙吗?谢谢!我正在使用 Django Rest 框架

编辑:这是 LikeViewSet 的模型:

class Likes(models.Model):
    user = models.ForeignKey(Profile, related_name='liker')
    post = models.ForeignKey(Post, related_name='   post' )
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('created',)

这个想法是,它是一个用户模型和帖子模型之间关系的模型表,所以过滤必须在 url 中以这种方式完成

【问题讨论】:

    标签: python django django-models django-rest-framework django-filter


    【解决方案1】:

    当您使用ViewSet 时,您应该使用destroy() 方法而不是delete()

    参见文档here

    ViewSet 类只是一种基于类的 View,它不 提供任何方法处理程序,例如 .get() 或 .post(),而不是 提供 .list() 和 .create() 等操作。

    根据您的代码,您似乎没有在 destroy/delete 方法中做任何独特的事情。只使用默认的destroy 函数可以吗?

    【讨论】:

    • destroy 是否使用相同的删除 http 请求?
    • @JohnD 是的。有一张图表说明了 HTTP 动词如何与视图集方法 here 匹配。
    • 我将如何进行过滤?抱歉,我是新手:/
    • @JohnD 没问题。你是如何使用你的过滤器的?很难说,但查询参数可能是不必要的。 post 你传递的只是pk 吗?如果是这样,那将由ModelViewSetRouter 自动实现。基本上,localhost:8000/likes/1 的 url 将为您提供模型的正确结果(基于您的 HTTP 动词),pk 为 1。要访问用户名,最好将其放在您的 view-- user = self.request.user。关于不同过滤方式的文档是here
    • 我编辑了问题以显示模型。我已经尝试过这些,但我想弄清楚我是否可以做一些事情,比如改变 destroy() 方法的查询集,比如: Likes.objects.filter(user = user, post = post) user 和 post 是属性通过 url 过滤
    猜你喜欢
    • 2013-09-27
    • 2013-04-14
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2016-09-19
    • 2011-06-09
    相关资源
    最近更新 更多