Django фильтрация с select_related с помощью Custom QuerySet, работает в оболочке, не работает в представлениях
Я использую Django 3.2
Ниже приведена сокращенная часть моего кода
models.py
class ItemQuerySet(models.QuerySet):
def qualified(self):
return self.filter(status=1)
def training(self):
return self.filter(status=2)
def failed(self):
return self.filter(status=3)
def showable(self):
Q1 = Q(status=1)
Q2 = (Q(last_fields__isnull=False) &
~Q(last_fields__exact=''))
return self.filter(Q1 | Q2)
class Foobar(models.Model):
# some fields
objects_qualifiers = ItemQuerySet().as_manager()
class Category(models.Model):
pass
class Foo(Foobar):
title = models.CharField(max_length=16)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
content = models.TextField()
is_done = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
views.py
class FooListView(ListView):
model = Foo
template_name = 'foobar/index.html'
context_object_name = 'foos'
paginate_by = 5
ordering=['-created_at']
def get_queryset(self):
return self.model.objects_qualifiers.showable().filter(is_done=True).all().select_related('author','category')
При обращении к представлению возникает следующая ошибка:
self.RelatedObjectDoesNotExist( foo.models.Foo.author.RelatedObjectDoesNotExist: У Foo нет автора
Это (кажется) имеет смысл, потому что я вызываю select_related
на объекте QuerySet - однако, ошибка немного вводит в заблуждение, потому что она определяет и сообщает правильный класс (Foo), но затем говорит, что у него нет поля author.
Имело бы смысл, если бы сообщение об ошибке говорило что-то вроде ItemQuerySet не имеет поля 'author'.
Чтобы проверить правильность моих рассуждений, я решил проверить свою гипотезу в оболочке:
вывод консоли
from foo.models import Foo
foo = Foo.objects.get(id=1)
foo.author
<Userprofile: Joe>
Foo.objects_qualified.showable().filter(is_done=False).select_related('author', 'category')
<ItemQuerySet [<Foo: Hello World!>]>
Это было неожиданно. Почему я могу получить доступ к select_related в консоли, но не в модуле views?
Что вызывает эту проблему, и как ее устранить?