我有以下功能:
def create_act(user, verb, fk_name=None, fk_value=None):
fk = getattr(Action, fk_name)
action = Action(user=user, verb=verb, fk=fk_value)
action.save()
行动是一个阶级。该课程有多个属性,我不知道哪个属性会得到一个值。
我将属性名称设为动态。
我希望kwarg fk
成为类动作的实际属性。 FK可以是账户或公司。
class Action(models.Model):
account = models.ForeignKey(Account, blank=True, null=True, related_name='activity', on_delete=models.CASCADE)
company = models.ForeignKey(Company, blank=True, null=True, related_name='activity', on_delete=models.CASCADE)
我在论坛上找到了一些答案,但与我无关,或者在python中。 我在其他网站上看到了一些使用eval的建议,但eval并不安全。
答案 0 :(得分:5)
使用dict
解压缩**
。请注意 - 如果fk_name
是ForeignKey
的名称 - fk
不是字符串,而是ForwardManyToOneDescriptor
。您可能仍想设置名为fk_name
的属性:
action = Action(user=user, verb=verb, **{fk_name: fk_value})
答案 1 :(得分:1)
这个想法是动态地传递给类创建一对属性名称和值,为此,使用name / value属性创建一个字典并使用字典解包传递它:
def create_act(user, verb, name, value):
attrs = {name: value}
action = Action(user=user, verb=verb, **attrs)
action.save()
return action