Pertanyaan Django - tentukan mana admin manajer Django model yang harus digunakan


Saya telah membuat Manajer kustom untuk model Django yang mengembalikan QuerySet memegang subset objek. Semua (). Saya ingin ini menjadi Manajer default model, karena saya juga membuat tag khusus yang akan mengambil konten dari model apa pun (ditentukan oleh argumen), dan perlu menggunakan Manajer default untuk model yang ditentukan. Semua yang berfungsi dengan baik, kecuali - Django Admin JUGA menggunakan Manajer default untuk model khusus ini, yang berarti bahwa tidak semua contoh model muncul di admin.

Dokumen Django tidak membantu:

Jika Anda menggunakan objek Manajer kustom, perhatikan bahwa Manajer pertama bertemu Django (dalam   urutan di mana mereka didefinisikan dalam model) memiliki status khusus. Django menafsirkan Manajer pertama ini didefinisikan di kelas sebagai "default" Manajer, dan beberapa bagian dari Django (meskipun bukan aplikasi admin) akan menggunakan Manajer itu secara eksklusif untuk model itu.    (Dokumentasi Manajer Django)

Admin tidak seharusnya menggunakan Manajer default, tetapi tampaknya ada dalam kasus saya. Perhatikan bahwa saya juga secara eksplisit menambahkan Manajer default objects:

subset = CustomManager() # the default manager
objects = models.Manager() # the one I want admin to use

Bagaimana saya bisa menentukan Manajer mana yang harus digunakan oleh admin?


32
2017-10-09 17:20


asal


Jawaban:


Anda dapat memilih manajer dengan mengesampingkan queryset metode di subclass ModelAdmin Anda.

def get_queryset(self, request):
    # use our manager, rather than the default one
    qs = self.model.objects.get_queryset()

    # we need this from the superclass method
    ordering = self.ordering or () # otherwise we might try to *None, which is bad ;)
    if ordering:
        qs = qs.order_by(*ordering)
    return qs

41
2017-10-09 18:23



Kode yang diperbarui:

def get_queryset(self, request):
    """
    Returns a QuerySet of all model instances that can be edited by the
    admin site. This is used by changelist_view.
    """
    qs = self.model._default_manager.get_queryset()
    # TODO: this should be handled by some parameter to the ChangeList.
    ordering = self.get_ordering(request)
    if ordering:
        qs = qs.order_by(*ordering)
    return qs

_default_manager dapat diganti ...


6
2018-06-21 10:56



Seperti yang kita harapkan objects untuk menjadi pengelola tunggal, admin akan digunakan manager di self.Admin.manager.

Dari tiket https://code.djangoproject.com/ticket/4754 dibuka oleh troy.simpson

class filterManager(models.Manager):
  def get_query_set(self):
    return super(filterManager, self).get_query_set().filter(name='troy')

class Blah(models.Model):
  name = models.CharField(maxlength=100)
  objects = filterManager()
  class Admin:
    manager = filterManager()

Diuji dengan Django 1.11


0
2018-06-21 10:49