如何将所有ForeignKey和OneToOneField字段设置为原始\u id\u字段

2024-10-01 02:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有3个字段作为set_soalsoalfolder。我需要将所有这些字段分配到raw_id_fields内的admin.ModelAdmin中,而不需要手动添加每个字段

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

screenshot 1

但是,我可以将所有的OneToOneFieldForeignKey字段自动设置到raw_id_fields中,而不需要手动添加它吗?例如,应用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

Tags: selfregisteridfieldsrawadminsitefolder
1条回答
网友
1楼 · 发布于 2024-10-01 02:35:03

您可以检查模型,在字段中搜索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.get_fields()
            if isinstance(f, ForeignKey) or isinstance(f, OneToOneField)
        )

AOneToOneField是AForeignKey的子类,因此不需要搜索AOneToOneField

相关问题 更多 >