首页 > 解决方案 > 如何在 Django 中将查询集过滤到当前用户

问题描述

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

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

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'),
        ]

标签: djangodjango-modelsdjango-tables2

解决方案


不需要包含第一个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.
        )

推荐阅读