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')
简单的一个 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)