我已经定义了一个User类,它(最终)继承自models.Model。我想获得为这个模型定义的所有字段的列表。例如,phone_number = CharField(max_length=20)。基本上,我想检索从Field类继承的任何东西。

我认为我可以利用inspect.getmembers(model)来检索这些字段,但是它返回的列表不包含这些字段中的任何一个。看起来Django已经掌握了这个类,添加了它所有神奇的属性,并去掉了实际定义的内容。所以…我怎样才能得到这些田地?他们可能有一个功能来检索他们自己的内部目的?


当前回答

MyModel._meta.get_all_field_names()在之前的几个版本中被弃用,并在Django 1.10中被移除。

以下是文档中向后兼容的建议:

from itertools import chain

list(set(chain.from_iterable(
    (field.name, field.attname) if hasattr(field, 'attname') else (field.name,)
    for field in MyModel._meta.get_fields()
    # For complete backwards compatibility, you may want to exclude
    # GenericForeignKey from the results.
    if not (field.many_to_one and field.related_model is None)
)))

其他回答

这很管用。我只在Django 1.7中测试它。

your_fields = YourModel._meta.local_fields
your_field_names = [f.name for f in your_fields]

Model._meta。Local_fields不包含多对多字段。您应该使用Model._meta.local_many_to_many来获取它们。

Django 1.8及以上版本:

你应该使用get_fields():

[f.name for f in MyModel._meta.get_fields()]

从Django开始不建议使用get_all_field_names()方法 将在1.10中删除。

上面链接的文档页面提供了完全向后兼容的get_all_field_names()实现,但是对于大多数目的,前面的示例应该可以正常工作。


1.8之前的Django版本:

model._meta.get_all_field_names()

这样应该可以了。

这需要一个实际的模型实例。如果你只有django.db.models的一个子类。然后你应该调用myproject.myapp.models.MyModel._meta.get_all_field_names()

所以在我找到这篇文章之前,我成功地找到了这个方法。

Model._meta.fields

它的工作原理和

Model._meta.get_fields()

我不确定结果有什么不同,如果有的话。我运行了这个循环,得到了相同的输出。

for field in Model._meta.fields:
    print(field.name)

这里提到的get_all_related_fields()方法在1.8中已弃用。从现在开始,它是get_fields()。

>> from django.contrib.auth.models import User
>> User._meta.get_fields()

只是补充,我使用self对象,这为我工作:

[f.name for f in self.model._meta.get_fields()]