Django:获取模型字段列表?
我已经定义了一个User
类(最终)从models.Model
inheritance。 我想获得为这个模型定义的所有字段的列表。 例如, 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'