【问题标题】:Django insert data to model with foreign keyDjango使用外键将数据插入模型
【发布时间】: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


【解决方案1】:

因为program_codeProgramInfo 模型中的主键,您可以使用该字段的值来设置或获取:

例如,假设您有一个 ProgramInfo 实例,其主键的值为“abcd”,您可以像这样使用它创建一个 StudentInfo:

StudentInfo.objects.create(program_code_id='abcd', ..... other fields ....)

因为 program_code_id 是真正存储在 StudentInfo 数据库中的内容。

【讨论】:

  • 我用另一种复杂的方式解决了它,我太害怕把它改成你说的那样。我知道 django 添加了一个 _id 后缀,但不知道这是什么意思。很抱歉,但我不想接受我没有尝试过的答案,但感谢您的输入!希望其他人尝试过,如果有效,可以投票!
【解决方案2】:

我以一种对我有用的不优雅的方式解决了它。给出的其他答案可能会更好,但我现在不敢更改我的代码,因为它似乎正在工作。这是我所做的,以防它可以帮助其他人: 使用:
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 为我解决了这个问题 - 尽管我知道它是一个 hack..

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 1970-01-01
    • 2014-09-30
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多