【发布时间】:2019-01-31 08:05:26
【问题描述】:
我正在使用 django 模型并且遇到了问题。我有几个模型要加载数据,其中一个模型带有另一个外键。我将使用两个模型作为示例,但希望我可以编写代码,以便它能够泛化以适用于具有不同名称和不同字段名称的模型。模型如下所示:
class ProgramInfo(models.Model):
program_code = models.CharField(max_length=5, primary_key=True)
...
class StudentInfo(models.Model):
...
program_code = models.ForeignKey('ProgramInfo', on_delete=models.PROTECT)
我还有一个名为 _model_dict 的字典,其中 StudentInfo 的字段名称作为键,值是我想要放入模型中的值。当我跑步时
_model.objects.update_or_create(**_model_dict)
它告诉我
Cannot assign "'ABCD'": "StudentInfo.program_code" must be a "ProgramInfo" instance.
即使 ProgramInfo 表中存在该值。
使用相同的方法向没有外键的模型插入数据没有问题。
据我了解,外键字段的 _model_dict 中键的值不应该只是单个字段的值,而是外键链接到的模型的对象。
我尝试挑选出外键字段,以便能够将 model_get 与过滤器一起使用并从目标模型中获取行并将其放入 _model_dict 但我不知道如何在给定已知 ForeignKey 字段的情况下获取目标模型.因为我打算概括我不想在特定代码中指定目标模型,而是想从我设法得出结论的字段中获取它是外键字段。我已经在谷歌上搜索了好几个小时,但找不到 ForeignKey 字段的目标模型 a 的属性。
我不知道它是否有用,但这是我用来尝试为外键创建类的代码:
# check for foreign keys
_model_field_objects = [f for f in _model._meta.get_fields()]
foreign_key_fields_dict = {}
for field in _model_field_objects:
if field.__class__ is ForeignKey:
foreign_key_fields_dict[field.name] = field #here i try to obtain target model of the field
print("Foreign key fields are: " + str(foreign_key_fields_dict))
sys.stdout.flush()
for row in data:
_model_dict = {key: value for key, value in zip(titles, row) if key in _model_field_names}
# adjust foreign key to their class
for key in _model_dict:
filter_arguments = {}
if key in foreign_key_fields_dict:
filter_arguments[key] = _model_dict[key]
_model_dict[key] = foreign_key_fields_dict[key].objects.filter(**filter_arguments)
# insert to table
_model.objects.update_or_create(**_model_dict)
我可能过于复杂了。如果 Django 提供了一种简单的方法,可以在给定外键字段的已知值(而不是它指向的模型的完整对象)的情况下使用外键添加到模型中,我会很高兴了解它。
提前感谢您提供的任何帮助!
【问题讨论】:
-
没有理由在两个模型中都有 program_code。如果一个模型是另一个模型的外键,您可以从这些对象的任一实例中访问该值。
-
这对我来说很容易命名,在StudentInfo中可以称为“程序”,并且程序在programInfo中有代码和其他属性。同名有区别吗?
标签: django database python-3.x django-models