我正在使用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字段的目标模型的属性。
我不知道它是否有用,但这是我用来尝试为外键创建类的代码:
# 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提供了一种简单的方法来添加带有外键的模型,并且给定了外键字段的已知值(而不是它所指向的模型的完整对象),那么我将很高兴学习它。
预先感谢您提供的任何帮助!
答案 0 :(得分:0)
由于program_code
是ProgramInfo
模型中的主键,因此您可以设置或使用该字段的值:
例如,假设您有一个ProgramInfo
实例,其主键的值为'abcd',则可以使用如下示例创建StudentInfo:
StudentInfo.objects.create(program_code_id='abcd', ..... other fields ....)
因为program_code_id
确实存储在StudentInfo数据库中。
答案 1 :(得分:0)
我以一种对我有用的非优雅方式解决了它。给出的其他答案可能会更好,但是由于它似乎正在工作,我现在不敢更改我的代码。如果可以帮助其他人,请执行以下操作:
使用:
from pprint import pprint
pprint(vars(myobject))
我设法发现ForeignKey
类型的对象具有属性ForeignKey.related_model
。一旦有了模型,就可以按如下方式使用它来获取模型中指向的行:
field.related_model.objects.get(pk=_model_dict[key])
其中field
是我要在其中插入数据的模型中的字段。可以将其结果放入_model_dict字典中,该字典包含我要向其中插入数据的模型的字段的所有其他值,因此可以使用以下方法来插入数据:
_model.objects.update_or_create(**_model_dict)
注意: update_or_create有时会崩溃,原因是唯一性存在问题,我认为这是应该解决的“ update_or”部分。无论如何,在它周围添加一个try / except可以为我解决该问题-尽管我知道它是一个黑客。.