Переопределение get_queryset в файле модели без необходимости создавать новый менеджер моделей в django?
У меня есть модель, и я использовал ее в нескольких местах, и менять ее во всех местах громоздко. Не могли бы вы подсказать мне, как это сделать? Я уже знаю, что могу создать пользовательский менеджер моделей, но менять менеджер моделей во всех местах не представляется возможным
class Slot(models.Model):
state = models.CharField(max_length=20, choices=SLOT_STATE, default=SLOT_STATE[0][0])
Согласно документации -
# First, define the Manager subclass.
class DahlBookManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(author='Roald Dahl')
# Then hook it into the Book model explicitly.
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
objects = models.Manager() # The default manager.
dahl_objects = DahlBookManager() # The Dahl-specific manager.
Я хочу сохранить тот же менеджер по умолчанию, но исключить все NULL слоты. P.S. Слот может иметь нулевое состояние.
Следуя документации, вы можете добавить пользовательский менеджер, который возвращает только объекты, где state is not NULL
:
class SlotNoNullStateManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(state__isnull=False)
class Slot(models.Model):
...
objects = models.Manager() # the default manager
no_null_state_objects = SlotNoNullStateManager()
Теперь ваша модель имеет 2 менеджера; и поведение по умолчанию не изменилось, потому что она по-прежнему использует тот же менеджер по умолчанию для .objects
.
Важно НЕ использовать .filter()
в методе .get_queryset()
в яслях по умолчанию, см. https://docs.djangoproject.com/en/3.2/topics/db/managers/#don-t-filter-away-any-results-in-this-type-of-manager-subclass