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

时间:2011-12-02 18:27:39

标签: django django-models django-admin many-to-many

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

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的解决方案 - 尽管它们确实有效,但它们并不理想。此外,在执行此操作时,我无法以任何方式更改模型,这是其他人的代码。谢谢!

谢谢你们。 本

2 个答案:

答案 0 :(得分:2)

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

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

没有参数化关系名称django n:m doc说:

new.authors = my_authors

答案 1 :(得分:0)

这假定作者没有被创建,而是被添加到该书的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) 

这是你在找什么?