Как использовать save_model в AdminForm, содержащем поле M2M?

у меня раздражающая проблема с системой моделей django + ее администратором по умолчанию.

Предположим, у меня есть очень простая модель, например:

class Note(models.Model):
    text = models.CharField(max_length=200)

def __unicode__(self):
    return self.text

и контейнер типа:

class NoteCollection(models.Model):
    notelist = models.ManyToManyField(Note)
    title = models.CharField(max_length=20)

def __unicode__(self):
    return self.title

Что я хочу сделать, так это обновить все элементы «Примечание» при добавлении NoteCollection. Я читал, что модели m2m имеют сложный механизм сохранения, поэтому я подумал, давайте прочитаем объект формы и просто сохраним элементы Note самостоятельно!

Но когда я делаю что-то подобное в APPNAME/admin.py:

from models import Note,NoteCollection
from django.contrib import admin

class NoteCollectionAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # Something USEFUL HERE
        pass

admin.site.register(Note)
admin.site.register(NoteCollection, NoteCollectionAdmin)

Django выдает мне сообщение об ошибке: (экземпляр «NoteCollection» должен иметь значение первичного ключа, прежде чем можно будет использовать отношение «многие ко многим».)

Я вообще не хочу использовать объект NoteCollection, на самом деле меня интересует объект формы..

Я также нашел в Интернете несколько примеров, в которых используется save_model с полем M2M, поэтому я не могу понять, почему я продолжаю получать эту ошибку; для справки, я только что сделал новый проект из металлолома и использую sqlite db для тестирования


person Valerio    schedule 29.11.2011    source источник


Ответы (1)


Переопределяя save_model() в NoteCollectionAdmin, вы запрещаете Django сохранять вашу коллекцию заметок. Обработав все, Django сохраняет таблицу m2m, но терпит неудачу, потому что коллекция заметок не имеет автоматического идентификатора, поскольку вы не сохранили ее в базе данных.

Основная проблема в том, что Django сохраняет файлы m2m после сохранения объектов. Я столкнулся с этим несколько дней назад, см. http://reinout.vanrees.org/weblog/2011/11/29/many-to-many-field-save-method.html

Несколько связанный вопрос: Проблема с отношениями ManyToMany, которые не обновляются сразу после сохранения

person Reinout van Rees    schedule 09.12.2011