Обновите поле многие ко многим в django, указав имя поля в переменной - PullRequest
0 голосов
/ 02 декабря 2011

Я хочу иметь возможность обновлять поле «многие ко многим» в модели, когда имя поля сохраняется в переменной.Это относительно просто для обычного поля (с 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 - хотя они работают, они не идеальны.Кроме того, я не могу изменить модель каким-либо образом, делая это, это чужой код.Спасибо!

Спасибо, ребята.Ben

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Читая ваш ответ, я думаю, что это то, что вы ищете:

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

Без имени для параметризации отношения django n: m doc скажем:

new.authors = my_authors
0 голосов
/ 02 декабря 2011

Предполагается, что авторы не создаются, а добавляются в поле 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) 

Это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...