如何确定模型列是否为外键?

bal*_*alu 12 python django foreign-keys

我根据请求在数据库中动态存储信息:

// table, id and column are provided by the request
table_obj = getattr(models, table)
record = table_obj.objects.get(pk=id)

setattr(record, column, request.POST['value'])
Run Code Online (Sandbox Code Playgroud)

问题是request.POST ['value']有时包含外部记录的主键(即整数),而Django期望列的值是ForeignModel类型的对象:

无法分配"u'122":"ModelA.b"必须是"ModelB"实例.

现在,有一种优雅的方法来动态检查b是否是包含外键的列以及这些键链接到哪个模型?(这样我可以通过它的主键加载外部记录并将其分配给ModelA?)或者Django不向程序员提供这样的信息,所以我真的不得不弄脏并在外国使用isinstance()关键栏目?

Joh*_*ery 13

您可以在模型_meta对象上使用get_field_by_name:


from django.db.models import ForeignKey

def get_fk_model(model, fieldname):
    '''returns None if not foreignkey, otherswise the relevant model'''
    field_object, model, direct, m2m = model._meta.get_field_by_name(fieldname)
    if not m2m and direct and isinstance(field_object, ForeignKey):
        return field_object.rel.to
    return None

假设您有一个模型类MyModel,那么您将使用它:


fk_model = get_fk_model(MyModel, 'fieldname')


Par*_*us- 5

简单的一个 liner 来查找models存在于 a 中的所有其他关系model

In [8]: relations = [f for f in Model._meta.get_fields() if (f.many_to_one or f.one_to_one) and f.auto_created]
Run Code Online (Sandbox Code Playgroud)

以上将给出一个与他们list的所有。modelsrelations

例子:

In [9]: relations
Out[9]:
[<ManyToOneRel: app1.model1>,
 <ManyToOneRel: app2.model1>,
 <OneToOneRel: app1.model2>,
 <OneToOneRel: app3.model5>,
 <OneToOneRel: app5.model1>]
Run Code Online (Sandbox Code Playgroud)