Как настроить все поля ForeignKey и OneToOneField в raw_id_fields - PullRequest
1 голос
/ 09 мая 2020

Например, у меня есть 3 поля как set_soal, soal и folder. Мне нужно назначить все эти поля в raw_id_fields внутри admin.ModelAdmin без добавления вручную для отдельных полей.

class DaftarSoal(TimeStampedModel):
    ....
    set_soal = ForeignKey(SetSoal, ...)
    soal = ForeignKey(Soal, ...)
    folder = ForeignKey(Folder, ...)

основной c способ включить необработанные поля идентификатора внутри admin.ModelAdmin выглядят так:

@admin.register(DaftarSoal, site=admin_site)
class DaftarSoalAdmin(admin.ModelAdmin):
    raw_id_fields = ('set_soal', 'soal', 'folder')    # manually

screenshot 1

Но могу ли я автоматически настроить все эти поля OneToOneField и ForeignKey в raw_id_fields без добавления это вручную? например, применение миксина классов, например:

class CustomAdminMixin:
    raw_id_fields = ()

    def __init__(self):
        self.setup_raw_id_fields()

    def setup_raw_id_fields(self):
        # search all OneToOneField and ForeignKey fields.
        # and assign into variable `raw_id_fields` above.

и его реализация;

@admin.register(DaftarSoal, site=admin_site)
class DaftarSoalAdmin(CustomAdminMixin, admin.ModelAdmin):
    pass



@admin.register(AnotherModel, site=admin_site)
class AnotherModelAdmin(CustomAdminMixin, admin.ModelAdmin):
    pass

1 Ответ

2 голосов
/ 09 мая 2020

Вы можете проверить модель, найти в полях экземпляры ForeignKey и добавить имя в кортеж, например:

from django.db.models import (ForeignKey, OneToOneField)

class CustomAdminMixin:
    raw_id_fields = ()

    def __init__(self, model, admin_site, *args, **kwargs):
        self.raw_id_fields = self.setup_raw_id_fields(model)
        super().__init__(model, admin_site, *args, **kwargs)

    def setup_raw_id_fields(self, model):
        return tuple(
            f.name
            for f in model._meta.<b>get_fields()</b>
            if <b>isinstance(f, ForeignKey) or isinstance(f, OneToOneField)</b>
        )

A OneToOneField является подклассом a ForeignKey, поэтому искать OneToOneField.

не нужно.
...