如何获取Django ORM映射的相关字段主键的SQL类型

How to to retrieve the SQL type of the primary key of a related field mapped by Django's ORM

我正在反思模型中某些字段的类型,特别是我对检索 RDBMS 相关类型感兴趣,即 "VARCHAR(20)",而不是 Django 字段 class( django.db.models.CharField 在这种情况下)。

我在关系方面遇到了问题,但是,因为数据库将两个表与 varchar 主键混合在一起,而其他表与 integer pks 混合(因此我无法做出任何假设)。

到目前为止,我已尝试使用以下代码检索字段类型:

# model is a django.db.model class
for field in model._meta.get_fields(include_parents=False):
    try:
        # this code works for anything but relations
        ft = field.db_type(connection=connection)
    except:
        # I'm introspecting a relation -> I would like to retrieve the field type of the related object's pk
        ft = field.related_model.pk.db_type(connection=connection)

在处理关系时失败并出现以下错误:

 'property' object has no attribute 'db_type'

当它失败时,field.__class__ 似乎是一个 ManyToOneRel 对象,如果这可能有任何帮助的话。还值得注意的是,代码必须与新的 Django 1.8 _meta.

兼容

对相关字段试试这个:

ft = field.related_model._meta.pk.db_type(connection=connection)

model.pk 确实是一个 属性,可以让您获得模型实例的 pk 值。 model._meta.pk 是实际的 Field 实例,它是该模型的主键。