Istnieje kilka rozwiązań, które przychodzą do głowy:
definiują co queryset użyć do listy zmian z ModelAdmin.queryset().
zainstaluj 2 menedżerów w swoim modelu, pierwszy, który administrator znajdzie jako domyślny AFAIK.
class SomeThing(models.Model):
objects = models.Manager()
shares = ShareManager()
dodać nową metodę na swoim menedżerem niestandardowy zwracającej aktywny tylko rzeczy i opuścić get_query_set
jak to jest domyślnie.
class ShareManager(models.Manager):
def get_active_items(self):
return self.get_query_set().filter(active=True)
Follow-up
Myślę, że najbardziej odpowiednim rozwiązaniem w przypadku byłoby łączenie # 1 i # 2 wariancji.
Ustaw niestandardowego menedżera jako objects
, aby wszyscy mogli uzyskać do niego dostęp (myślę, że to powinno działać w przypadku problemu z ponownym użyciem), a także zainstalować domyślnego menedżera w swoim modelu i użyć go w ModelAdmin.queryset()
.
class SomeThing(models.Model):
objects = ShareManager()
admin_objects = models.Manager()
Powinienem również dołączyć przykład metody ModelAdmin.queryset()
, więc oto jest.
def queryset(self, request):
qs = self.model.admin_objects.get_query_set()
# TODO: this should be handled by some parameter to the ChangeList.
# otherwise we might try to *None, which is bad ;)
ordering = self.ordering or()
if ordering:
qs = qs.order_by(*ordering)
return qs
Uwaga linia qs = self.model.admin_objects.get_query_set()
pracuje z admin_objects
który jest wystąpienie zwykłego menedżera i zawiera niepublikowane przedmiotów.
Reszta tej implementacji metody queryset
jest domyślną implementacją Django, która zwykle wywołuje qs = self.model._default_manager.get_query_set()
.
Mam nadzieję, że to trochę wyjaśni.
Dzięki za wiele rozwiązań, pomaga mi to zrozumieć więcej. Kilka pytań: Dla # 1, jak mogę uzyskać wszystkie obiekty jako zestaw zapytań, jeśli zostawiam niestandardowy Menedżer w miejscu? # 2 i # 3 również działają, ale napotykam problemy, gdy używam aplikacji wielokrotnego użytku, takich jak queryset = TaggedItem.objects.get_by_model (Share, tag). – knuckfubuck
Zapomniałem podać przykład metody 'queryset'. –
Dziękuję za obserwację. Ta kombinacja działa świetnie. – knuckfubuck