当我只知道字段的名称和模型的名称(两个普通字符串)时,我试图获取模型内部字段的类信息。怎么可能?
我可以动态加载模型:
from django.db import models
model = models.get_model('myapp','mymodel')
现在我有了字段 - 'myfield' - 我怎样才能获得该字段的类?
如果字段是关系字段 - 如何获取相关字段?
非常感谢!
答案 0 :(得分:73)
您可以使用模型的_meta
属性来获取字段对象,并且可以从字段中获取关系等等。考虑具有部门表的外键的员工表
In [1]: from django.db import models
In [2]: model = models.get_model('timeapp', 'Employee')
In [3]: dep_field = model._meta.get_field_by_name('department')
In [4]: dep_field[0].target_field
Out[4]: 'id'
In [5]: dep_field[0].related_model
Out[5]: <class 'timesite.timeapp.models.Department'>
来自django / db / models / options.py
def get_field_by_name(self, name):
"""
Returns the (field_object, model, direct, m2m), where field_object is
the Field instance for the given name, model is the model containing
this field (None for local fields), direct is True if the field exists
on this model, and m2m is True for many-to-many relations. When
'direct' is False, 'field_object' is the corresponding RelatedObject
for this field (since the field doesn't have an instance associated
with it).
Uses a cache internally, so after the first access, this is very fast.
"""
答案 1 :(得分:7)
Anurag Uniyal使用get_field_by_name
的答案现在(5年后)已过时,因为get_field_by_name
已被弃用。
Django会给你以下提示:
RemovedInDjango110Warning:'get_field_by_name是一个非官方的API 已被弃用。您可以用它替换它 'get_field()'
get_field
的API文档为here。
答案 2 :(得分:2)
如果您想在Django模型对象上看到所有字段,可以通过调用类(或实例化的模型对象)上的._meta.get_fields()
来简单地对其进行内省,以获取所有字段的列表。这个API是最新版本的Django的最新版本。
示例:
from django.contrib.auth.models import User
User._meta.get_fields()
这将返回所有模型字段的元组。可以找到文档HERE。
答案 3 :(得分:1)
django.db.models.loading.get_model()已在django 1.9中删除。 您应该改用django.apps。
'get_field_by_name是一个非正式的API,在Django 1.10中已弃用。您也许可以将其替换为“ get_field()”
>>> from django.apps import apps
>>> from polls.models import Question
>>> QuestionModel = apps.get_model('polls','Question')
>>> QuestionModel._meta.get_field('pub_date')
>>> QuestionModel._meta.get_fields()
(<ManyToOneRel: polls.choice>, <django.db.models.fields.AutoField: id>, <django.db.models.fields.CharField: question_text>, <django.db.models.fields.DateTimeField: pub_date>)