在变量中使用字段名称更新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)
这是你在找什么?
答
读你的答案,我认为这是你正在寻找:
relation_name = 'authors'
new.__getattribute__(relation_name) = my_authors
随着出参数多态关系名django n:m doc说:
new.authors = my_authors
谢谢,但没有 - 这个词的作者“是存储在一个变量中,所以我不能做new.authors.add()。此外,您可以在此实例中执行new.authors.add(my_authors) - 它接受一个列表!谢谢:) – Ben
你能做这样的事情吗?我没有测试过,但是你可以创建一个像switch语句的字典。 'fields = {'authors':new.authors,'title':new.title}'和'fields [field_name] .add(my_authors)' – Furbeenator
我不确定那会怎么样? – Ben