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