如何反思Django模型域?

2024-06-13 21:44:11 发布

您现在位置:Python中文网/ 问答频道 /正文

当我只知道字段名和模型名(都是纯字符串)时,我正试图获取模型中字段的类信息。怎么可能?

我可以动态加载模型:

from django.db import models
model = models.get_model('myapp','mymodel')

现在我有了字段-“myfield”-我如何得到该字段的类?

如果字段是关系字段-如何获取相关字段?

谢谢大家!


Tags: django字符串from模型import信息dbget
3条回答

您可以使用模型的_meta属性来获取field对象,而从field中您可以获取关系以及更多信息,例如,考虑一个employee表,该表具有department表的外键

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.
    """

如果您想查看Django模型对象上的所有字段,可以通过调用类(或实例化的模型对象)上的._meta.get_fields()来获得所有字段的列表,从而简单地对其进行内省。这个API是Django的最新版本。

示例:

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

这将返回所有模型字段的元组。文档可以找到HERE

Anurag Uniyal使用get_field_by_name的答案现在(5年后)已经过时,因为get_field_by_name已被弃用。 Django会给你以下提示:

RemovedInDjango110Warning: 'get_field_by_name is an unofficial API that has been deprecated. You may be able to replace it with 'get_field()'

get_field的API文档是here

相关问题 更多 >