Django:获取模型字段列表?

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

我想我可以通过利用inspect.getmembers(model)来获取这些信息,但是它返回的列表不包含任何这些字段。 它看起来像Django已经掌握了类,并添加了所有的魔法属性,并剥离了实际定义的内容。 所以…我怎么能得到这些领域? 他们可能有一个function来检索他们的内部目的?

对于Django版本1.8和更高版本:

get_all_field_names()方法从Django 1.8开始被弃用,并将在1.10中被删除 。

上面链接的文档页面提供了get_all_field_names()的完全向后兼容的实现,但是对于大多数目的而言, [f.name for f in MyModel._meta.get_fields()]应该工作得很好。

对于1.8之前的Django版本:

 model._meta.get_all_field_names() 

这应该够了吧。

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

我发现添加到Django模型相当有帮助:

 def __iter__(self): for field_name in self._meta.get_all_field_names(): value = getattr(self, field_name, None) yield (field_name, value) 

这可以让你做到:

 for field, val in object: print field, val 

这里提到的get_all_related_fields()方法在1.8中已经被弃用了 。 从现在起它是get_fields()

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

这是诀窍。 我只在Django 1.7中testing它。

 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来获取它们。

MyModel._meta.get_all_field_names()弃用了几个版本,并在Django 1.10中被删除

这是来自文档的向后兼容的build议:

 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) ))) 

只是添加,我使用自我对象,这对我工作:

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

目前还不清楚你是否有一个类的实例或类本身,并试图检索这些字段,但无论如何,请考虑下面的代码

使用一个实例

 instance = User.objects.get(username="foo") instance.__dict__ # returns a dictionary with all fields and their values instance.__dict__.keys() # returns a dictionary with all fields list(instance.__dict__.keys()) # returns list with all fields 

使用一个类

 User._meta.__dict__.get("fields") # returns the fields # to get the field names consider looping over the fields and calling __str__() for field in User._meta.__dict__.get("fields"): field.__str__() # eg 'auth.User.id'