保存后,在Django中的ManyToMany字段中自动创建记录

时间:2014-05-30 18:47:43

标签: python django relationship django-models

我正在建立一个网站,我有一个技能'用户可以输入他们拥有的技能并保存它们。由于我计划对此进行搜索并且我也想要数据,因此我创建了一个单独的Skill模型,该模型将托管我的Users模型的技能列表有一个ManyToMany字段。

由于我不会提前知道会有什么技能,我需要自动生成这些记录。我已经尝试使用pre_save模型上的Users信号来创建可能尚不存在的任何技能,但由于我会多次使用此功能,因此我会这样做喜欢创建一个AutoPopulateManyToMany字段,如果它们不存在,则会在保存调用模型时在相关模型中创建新记录。

我难以确定在子类化ManyToManyField时要覆盖哪些方法,以便坚持创建新技能的代码。我希望代码看起来像某些东西,特别是技能:

for item in <list of skills>:
    if not Skill.objects.filter(name=item):
        self.skills.create(name=name)

或者,更一般地说,这看起来像下面这样:

for item in <related model items>:
    if not related_model.objects.filter(**{filter_field: item}):
        self.related_model_m2m_field.create(**{filter_field: item})

我无法弄清楚ManyToManyField对象创建过程中保存新项目的位置。特别是,我甚至不确定我是否能够访问该字段属于Field对象本身的类。

1 个答案:

答案 0 :(得分:0)

我不知道在哪里放置&#34;创造技能&#34;功能,但考虑这个实现:

for missing_name in set(skill_names) - set(Skill.objects.filter(name__in=skill_list).values_list('name',flat=True) ):
    _ = Skill.objects.get_or_create(name=missing_name)

它执行单个查询以查找数据库中已存在的所有给定技能名称。然后,对于每个不存在的名称,尝试创建它。如果技能是在filter()get_or_create()之间创建的 - 你有竞争条件 - 那么就安全地继续前进。

_符号表示&#34;我正在调用一个返回结果的函数,但是我明确地忽略了它。&#34;你也可以做一个{{ 1}}阻止。)