我正在建立一个网站,我有一个技能'用户可以输入他们拥有的技能并保存它们。由于我计划对此进行搜索并且我也想要数据,因此我创建了一个单独的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
对象本身的类。
答案 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}}阻止。)