【问题标题】:Filter list of objects by self.request.user in Django在 Django 中按 self.request.user 过滤对象列表
【发布时间】:2017-08-05 10:08:25
【问题描述】:

我无法让它工作:

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)

谁能帮帮我?

提前谢谢你。

【问题讨论】:

  • print(type(self.request.user))print(self.request.user) 给你什么输出?
  • 我得到的输出是:<class 'django.utils.functional.SimpleLazyObject'> a 另外我不认为这是重复的,因为答案是代码不能在类级别,而我的代码不在班级级别。
  • 您如何在设置中导入用户并定义身份验证?我的代码看起来与你的工作相同,我的类型输出是django.contrib.auth.models.User
  • 以这种方式导入用户from django.contrib.auth.models import User再试一次

标签: python django class view request


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    from django.contrib.auth.models import User
    

    让您的其他模型和视图保持原样(除非它们也导入用户)。

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

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

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

    【讨论】:

    • 我通过创建自己的名为 Person 的单独 User 类解决了这个问题,该类使用与 User 的 OneToOne 关系。在此感谢大家的帮助。 from django.contrib.auth.models import User class Person(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE)
    【解决方案3】:

    您可以使用 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()
    

    【讨论】:

    • 纯代码答案可能没有帮助,请考虑编辑您的答案以解释您的代码的作用以及它与问题的关系
    猜你喜欢
    • 2010-11-04
    • 2014-08-22
    • 2011-01-10
    • 2015-03-24
    • 1970-01-01
    • 2023-02-06
    • 2018-11-07
    • 2013-08-19
    • 2017-06-14
    相关资源
    最近更新 更多