我正在使用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
?
答案 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)