我怎样才能使用Model._meta.get.fields()来读取模型中的所有字段

时间:2017-05-17 05:35:15

标签: django

我想显示一些字段,我知道我可以通过以下方式完成:

在models.py中:

class Person(models.Model):
    person_id = models.UUIDField(default=uuid.uuid4, primary_key = True)
    date_registered = models.DateField(auto_now_add=True)   
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 100)
    date_of_birth = models.DateField() 
    email = models.EmailField()

在我的admin.py中:

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'last_name', 'date_of_birth' )
    fields = [('first_name' ,'last_name'), 'date_of_birth']
    pass
admin.site.register(Author, AuthorAdmin)

不幸的是,我的表有很多字段,我不想单独编写它们。我发现._meta.get.fields()可以读取所有字段。但是,我无法理解它。在我的admin.py中使用如下:

admin.site.register(PersonLogin)
admin.site.register(LoginHistory)

class PersonAdmin(admin.ModelAdmin):
    list_display = [field.name for field in Person._meta.get_fields() if not field.primary_key]  
    readonly_fields = ('person_id',)
    pass

admin.site.register(Person, PersonAdmin)

它说_meta是未定义的变量。

最新使用的Django。

提前谢谢你。 PG

1 个答案:

答案 0 :(得分:1)

_meta不可用意味着Django尚未设置其环境。您可以通过添加以下内容进行设置:

import django
django.setup()

在顶部,但这有点脏。看看你是否可以将列表理解移到__init__

class PersonAdmin(admin.ModelAdmin):

    def __init__(self, model, admin_site):
        self.list_display = [
            field.name for field in Person._meta.get_fields()
            if not field.primary_key
        ]
        super().__init__(model, admin_site)

编辑:为了适应Eclipse内省错误,您可以使用getattr明确告诉它它是运行时的东西:

self.list_display = [
    field.name for field in getattr(Person, '_meta').get_fields()
    if not field.primary_key
]