我已经定义了一个User类,它(最终)继承自models.Model。我想获得为这个模型定义的所有字段的列表。例如,phone_number = CharField(max_length=20)。基本上,我想检索从Field类继承的任何东西。
我认为我可以利用inspect.getmembers(model)来检索这些字段,但是它返回的列表不包含这些字段中的任何一个。看起来Django已经掌握了这个类,添加了它所有神奇的属性,并去掉了实际定义的内容。所以…我怎样才能得到这些田地?他们可能有一个功能来检索他们自己的内部目的?
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()
为什么不直接用它呢:
manage.py inspectdb
示例输出:
class GuardianUserobjectpermission(models.Model):
id = models.IntegerField(primary_key=True) # AutoField?
object_pk = models.CharField(max_length=255)
content_type = models.ForeignKey(DjangoContentType, models.DO_NOTHING)
permission = models.ForeignKey(AuthPermission, models.DO_NOTHING)
user = models.ForeignKey(CustomUsers, models.DO_NOTHING)
class Meta:
managed = False
db_table = 'guardian_userobjectpermission'
unique_together = (('user', 'permission', 'object_pk'),)
至少在Django 1.9.9(我目前使用的版本)中,请注意.get_fields()实际上也将任何外部模型“视为”字段,这可能是有问题的。假设你有:
class Parent(models.Model):
id = UUIDField(primary_key=True)
class Child(models.Model):
parent = models.ForeignKey(Parent)
由此可见
>>> map(lambda field:field.name, Parent._model._meta.get_fields())
['id', 'child']
,如@Rockallite所示
>>> map(lambda field:field.name, Parent._model._meta.local_fields)
['id']
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)
)))