这是我的代码:
def update_tags_with_value(tags, many_to_many_class):
if tags:
many_to_many_class.objects.filter(
personne=self.instance,
date_v_fin=None
).update(date_v_fin=django_datetime.now())
for idx_tag_with_value in tags:
pl = many_to_many_class.objects.create(
personne=self.instance,
langue=TagWithValue.objects.get(
pk=idx_tag_with_value
)
)
pl.save()
update_tags_with_value(self.cleaned_data.get('known_languages'),
PersonneLangue)
update_tags_with_value(self.cleaned_data.get('types_permis'),
PersonneTypesPermis)
所以我发现我可以轻松地将一个类作为参数传递。但最后一个问题是关于命名参数。如果你看我的代码,我会做langue=TagWithValue..[blabla]
。问题是它是一个“命名”参数,我希望能够像这样传递它:
update_tags_with_value(self.cleaned_data.get('known_languages'),
PersonneLangue, 'langue')
update_tags_with_value(self.cleaned_data.get('types_permis'),
PersonneTypesPermis, 'permis')
然后以某种方式调用它(它不起作用还):
def update_tags_with_value(tags, many_to_many_class, champ):
if tags:
many_to_many_class.objects.filter(
personne=self.instance,
date_v_fin=None
).update(date_v_fin=django_datetime.now())
for idx_tag_with_value in tags:
pl = many_to_many_class.objects.create(
personne=self.instance,
champ=TagWithValue.objects.get(
pk=idx_tag_with_value
)
)
pl.save()
现在我收到此错误:
'champ' is an invalid keyword argument for this function
更准确地说,我需要many_to_many_class.objects.create()
一次known_languages=blabla
,types_permis=blabla
再推一次,换句话说,应拨打一次many_to_many_class.objects.create(known_languages=blabla)
和{ {1}}我想知道是否有办法精确仅参数名称,不 many_to_many_class.objects.create(types_permis=blabla)
如何解决这个问题?
答案 0 :(得分:0)
非常不推荐,但可以使用exec()
函数。
def update_tags_with_value(tags, many_to_many_class, champ):
if tags:
many_to_many_class.objects.filter(
personne=self.instance,
date_v_fin=None
).update(date_v_fin=django_datetime.now())
for idx_tag_with_value in tags:
command = """pl = many_to_many_class.objects.create(
personne=self.instance,"""
+
champ
+
"""=TagWithValue.objects.get(
pk=idx_tag_with_value
)
)"""
exec(command)
pl.save()
但正如我所说,它不是pythonic,很容易失败。你应该对它进行真正的测试,以便继续采用这种方法。
我的建议是将每种情况封装到函数中,并根据传递的参数调用这些函数。
但是为了回答你的问题,这就是它的完成方式。
答案 1 :(得分:0)
似乎普通的关键字解包会起作用。 。
kwargs = {champ: TagWithValue.objects.get(
pk=idx_tag_with_value)}
pl = many_to_many_class.objects.create(
personne=self.instance,
**kwargs)
当然,现在champ
可能不是函数参数的最佳名称,但希望您明白这一点。
答案 2 :(得分:0)
这是我的工作解决方案,我不知道它是否是最好的" pythonic"方式,但它就像一个魅力:
def update_tags_with_value(tags, many_to_many_class, champ):
if tags:
many_to_many_class.objects.filter(
personne=self.instance,
date_v_fin=None
).update(date_v_fin=django_datetime.now())
for idx_tag_with_value in tags:
args = {
'personne': self.instance,
champ: TagWithValue.objects.get(
pk=idx_tag_with_value
)}
pl = many_to_many_class.objects.create(**args)
pl.save()
update_tags_with_value(self.cleaned_data.get('known_languages'),
PersonneLangue, 'langue')
update_tags_with_value(self.cleaned_data.get('types_permis'),
PersonneTypePermis, 'type_permis')
update_tags_with_value(self.cleaned_data.get('diplomes'),
PersonneDiplome, 'diplome')
update_tags_with_value(self.cleaned_data.get('centres_dinteret'),
PersonneCentreDInteret, 'centre_dinteret')
update_tags_with_value(self.cleaned_data.get('hobbies'),
PersonneHobby, 'hobby')