Django插入数据以使用外键建模

时间:2018-08-24 20:25:36

标签: django database python-3.x django-models

我正在使用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提供了一种简单的方法来添加带有外键的模型,并且给定了外键字段的已知值(而不是它所指向的模型的完整对象),那么我将很高兴学习它。
预先感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:0)

由于program_codeProgramInfo模型中的主键,因此您可以设置或使用该字段的值:

例如,假设您有一个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可以为我解决该问题-尽管我知道它是一个黑客。.