Вы не хотели бы устанавливать эту присоску, потому что, как только тип Item
создан, его состояние затем разделяется между потоками, что включает в себя менеджер по умолчанию.Тогда вы можете получить 10 элементов, даже если пользователь для текущего запроса имеет тип long
, потому что у вас есть конфликт потоков в менеджере моделей.(см. ModelBase в пакете django.db.models.base
)
В вашем случае вы захотите сделать совершенно очевидным, что вы делаете.Это мое лучшее предположение:
class ItemManager(models.Manager):
def latest_for_user_type(user_type):
limit = user_type=='brief' and 10 or user_type=='long' and 30
return self.get_query_set().order_by('date')[:limit]
class Item(models.Model)
# ...
objects = ItemManager()
# views.py
class LatestItemListView(ListView):
def get_query_set(self):
return Item.objects.latest_for_user_type(
user_type=user_type(self.request.user)
)
Возможно, вы захотите реализовать логику user_type()
в ItemManager
... вы можете даже реорганизовать ее в latest_for_user(user=None, user_type=None)
.Это просто основная идея, и существуют другие способы, такие как прокси-классы, которые являются идеальными (единственный верный способ) для переопределения менеджеров моделей.
Менеджеры - это правильный способ реализации всего, что работает с коллекциями.