在变量中使用字段名称更新django中的多对多字段

问题描述:

当字段的名称存储在变量中时,我希望能够更新模型上的多对多字段。对于普通字段(在构造函数中使用kwargs)或者甚至是外键来说,这是相对容易的,但对于多对多字段则不是这样。这里的情况:在变量中使用字段名称更新django中的多对多字段

class Book(models.Model): 
    title = models.CharField(max_length=30) 
    authors = models.ManyToManyField(Author) 

field_name = 'title' 
new = Book(**{field_name:'My Book'}) # This sets title to mybook 
new.save() 
my_authors = Author.objects.filter(name='Ben') # Get some authors 
field_name = 'authors' 
new.XXXXXX = my_authors # Add them 

如何做好XXXXXX位是我在问什么!它不像其他领域的kwargs那样被接受,因为你首先需要一个主键,并且只有在它被保存之后才能发生。有任何想法吗?任何帮助非常感谢!这一定是可能的 - Django管理员必须做到这一点,但我找不到在哪里。

* 编辑 - 我理想地寻找一种不使用__getattribute或__setattr的解决方案 - 尽管它们可以工作,但它们并不理想。另外,在做这件事时,我无法以任何方式改变模型,这是别人的代码。谢谢!

谢谢你们。 本

这假设作者没有被创建,但被添加到本书的M2M领域。

my_authors = Author.objects.filter(name='Ben') # Get some authors 

# This will append all authors from my_authors to the M2M field. 
for a in my_authors: 
    new.authors.add(a) 

这是你在找什么?

+0

谢谢,但没有 - 这个词的作者“是存储在一个变量中,所以我不能做new.authors.add()。此外,您可以在此实例中执行new.authors.add(my_authors) - 它接受一个列表!谢谢:) – Ben

+0

你能做这样的事情吗?我没有测试过,但是你可以创建一个像switch语句的字典。 'fields = {'authors':new.authors,'title':new.title}'和'fields [field_name] .add(my_authors)' – Furbeenator

+0

我不确定那会怎么样? – Ben

读你的答案,我认为这是你正在寻找:

relation_name = 'authors' 
new.__getattribute__(relation_name) = my_authors 

随着出参数多态关系名django n:m doc说:

new.authors = my_authors 
+0

谢谢,我的意思是在我的问题中说,我知道你可以用新的.__ setattr __(field,my_authors)来做到这一点 - 但我想避免使用__setattr__,因为它使用基本的python方法的对象,除非应该不真正被访问绝对有必要!谢谢。 – Ben

+0

那么,这不是你的解决方案?您可以在模型上编写自定义方法,并且该方法可以访问setattr。 – danihp

+0

是的,这是可行的 - 但我试图避免使用getattribute或setattribute。另外,我无法改变模型 - 它们不是我的代码。 – Ben