【问题标题】:How to filter queryset to current user in Django如何在 Django 中将查询集过滤到当前用户
【发布时间】:2020-11-11 22:55:18
【问题描述】:

我有一个网站可以抓取当前用户下列出的所有记录。

现在它会抓取并过滤到所有可用记录,然后过滤到当前用户。有没有办法让它不必进行初始过滤?

class PromiseView(SingleTableView):
    queryset = Promise.objects.filter(deleted__isnull=True)
    table_class = PromiseTable
    template_name = 'promise.html'

    def get_queryset(self):
        

        return self.queryset.filter(
            windows_user=self.request.user, # There has to be a better way for this one.
        )

我想让它的初始查询集等于

queryset = Promise.objects.filter(windows_user=self.request.user,deleted__isnull=True)

并摆脱 get_queryset 函数。 首先查询整个数据库然后再次查询以过滤到我想要的方式是没有意义的。

这是模型

class Promise(models.Model):
    windows_user = models.CharField('Windows', max_length=20)
    event_date = models.DateTimeField('Date')
    notes = models.CharField('note', max_length=100)
    deleted = models.DateTimeField('Deleted', null=True)

    class Meta:
        db_table = 'form_promise'
        indexes = [
            models.Index(fields=['windows_user','deleted', ], name='index01'),
        ]

【问题讨论】:

  • 可以分享模型吗?
  • 究竟为什么需要[10:len(...)] 部分?
  • 我已经分享了模型。我已经删除了长度部分,因为这与问题无关。我希望能够访问当前用户的用户名,而不必使用 get_queryset 函数
  • Promise 模型在哪里与 User 模型相关?根据您发布的代码,您实际上并没有连接它们,除非您在自定义用户模型上进行了连接。 'windows_user' 只是一个 CharField...您可能希望将 'user' 定义为 Promise 上的一个字段,与 User 具有 ForeignKey 或 M2M 关系。
  • 我目前让他们通过他们的 Windows 用户名进行身份验证。该站点检测到他们的 Windows 用户名。

标签: django django-models django-tables2


【解决方案1】:

您不需要包含第一个queryset = ...,只需使用get_queryset() 来填充数据。如果你想明确一点,那么你可以用qs.none() 初始化一个不会命中数据库的空查询集,然后从get_queryset() 返回实际数据。

class PromiseView(SingleTableView):
    queryset = Promise.objects.none()  # optional
    table_class = PromiseTable
    template_name = 'promise.html'

    def get_queryset(self):
        return Promise.objects.filter(
            deleted__isnull=True,
            windows_user=self.request.user.username,  # I think you need user.username here.
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2020-08-22
    • 2019-04-15
    相关资源
    最近更新 更多