如何将所有外键和 OneToOneField 字段设置为 raw_id_fields

How to setup all ForeignKey & OneToOneField fields into raw_id_fields

例如,我将这 3 个字段设置为 set_soalsoalfolder。我需要将所有这些字段分配到 admin.ModelAdmin 内的 raw_id_fields 中,而无需手动添加 per-single 字段。

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

admin.ModelAdmin 中启用原始 ID 字段的基本方法如下所示;

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

但是,我可以将所有 OneToOneFieldForeignKey 字段自动设置为 raw_id_fields 而无需手动添加吗?例如应用 class mixin,例如:

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

您可以检查模型,并在字段中搜索 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 OneToOneFieldForeignKey 的子类,因此无需搜索 OneToOneField.