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

jdotjdot

我正在建立一个网站,其中有一个“技能”部分,用户可以在其中键入自己拥有的技能并保存。由于我计划对此进行搜索,并且我也希望获得数据,因此我正在创建一个单独的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对象本身的一部分的类

约翰泰尔索尔

我不知道在何处放置“创建技能”功能,但请考虑以下实现:

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()-您有比赛条件-那么请继续前进。

_符号的意思是“我正在调用一个返回结果的函数,但是我明确地忽略了它。”您还可以执行一个try/except块。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档