在Django中通过self.request.user过滤对象列表

时间:2017-03-14 21:18:26

标签: python django class view request

我无法让这个工作:

class MyView(generic.ListView):
    context_object_name = 'my-model-list'
    template_name = 'my_models.html'

    def get_queryset(self):
        return MyModel.objects.filter(user=self.request.user)

我也试过

return MyModel.objects.filter(user=User.objects.filter(name=self.request.user))

似乎self.request.user正在返回一个名字。我得到的错误是

Cannot query "a": Must be "User" instance.

用户名是“a”。

我的模特是

from .models import User

class MyModel(models.Model):
    user = models.ForeignKey(User)

任何人都可以帮助我吗?

提前谢谢。

3 个答案:

答案 0 :(得分:1)

您以错误的方式继承User模型。 请改用from django.contrib.auth.models import User

答案 1 :(得分:1)

您显示的代码是正确的。问题是您正在定义自己的User类,而Django在发出请求时不知道如何处理它。

最简单的方法是使用Django用户。如果您坚持使用自己的用户类,则需要修改该类以正确继承Django用户和其他一些东西(其上有一些StackOverflows)。

在./MyModel/models.py中,您需要导入用户:

from django.contrib.auth.models import User

保留其他模型和视图(除非他们也导入用户)。

您可能还需要更新设置文件,看起来像这样(这可能不完全正确):

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    )

在进行这些更改后,不要忘记迁移数据库。

答案 2 :(得分:0)

  

您可以使用self.request.user.mymodel_set.all()获取当前用户的所有查询

from .models import User

class MyModel(models.Model):
    user = models.ForeignKey(User)


class MyView(generic.ListView):
    context_object_name = 'my-model-list'
    template_name = 'my_models.html'

    def get_queryset(self):
        return self.request.user.mymodel_set.all()