如何将所有外键和 OneToOneField 字段设置为 raw_id_fields
How to setup all ForeignKey & OneToOneField fields into raw_id_fields
例如,我将这 3 个字段设置为 set_soal
、soal
和 folder
。我需要将所有这些字段分配到 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
但是,我可以将所有 OneToOneField
和 ForeignKey
字段自动设置为 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 OneToOneField
是 ForeignKey
的子类,因此无需搜索 OneToOneField
.
例如,我将这 3 个字段设置为 set_soal
、soal
和 folder
。我需要将所有这些字段分配到 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
但是,我可以将所有 OneToOneField
和 ForeignKey
字段自动设置为 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 OneToOneField
是 ForeignKey
的子类,因此无需搜索 OneToOneField
.