在Django中的模型查询集中使用self.request.user

时间:2017-12-14 20:52:59

标签: python django django-models django-queryset

我正在使用Django 2

我有一个模型,我在其中编写了一个查询集类来添加搜索功能。

我想只显示与经过身份验证的用户关联的结果。为此,我在查询集中的过滤器中使用user=self.request.user

备注/ model.py

class NoteQuerySet(models.query.QuerySet):
    def authenticated(self):
        return self.filter(user=self.request.user)

    def search(self, query):
        lookups = Q(title__icontains=query) | Q(tags__icontains=query)
        return self.filter(lookups).authenticated().distinct()


class NoteManager(models.Manager):
    def get_queryset(self):
        return NoteQuerySet(self.model, using=self._db)

    def search(self, query):
        return self.get_queryset().search(query)


class Note(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=250, blank=True, default='Untitled')
    tags = models.CharField(max_length=150, blank=True)

    objects = NoteManager()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('notes:update', kwargs={'pk': self.pk})

Notes / views.py

class SearchNoteView(ListView):
    template_name = 'notes/my_notes.html'
    context_object_name = 'notes'

    def get_queryset(self, *args, **kwargs):
        query = self.request.GET.get('q', None)
        if query is not None:
            return Note.objects.search(query)

但是这个返回错误为

AttributeError: 'NoteQuerySet' object has no attribute 'request'

正如错误所述,它正在尝试使用该类找到request功能。

如何在查询集类中使用request

1 个答案:

答案 0 :(得分:1)

您必须以某种方式传递用户对象:

class NoteQuerySet(models.query.QuerySet):
    def authenticated(self, user):
        return self.filter(user=user)

如果您直接使用filter

,我认为会更清楚
 Note.objects.filter(user=self.request.user).search(query)