我在django模型系统和它的默认admin中遇到了一个恼人的问题。
让我们假设我有一个非常简单的模型:
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被添加时,我想做的是更新所有的"Note"元素。我读到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数据库测试
通过在NoteCollectionAdmin中重写save_model(),你将阻止Django保存你的NoteCollectionAdmin。处理完所有内容后,Django保存m2m表,但是失败了,因为notecollection没有自动ID,因为你没有将它保存在数据库中。
主要问题是Django在保存对象之后保存m2m文件。几天前我纠结于此,参见http://reinout.vanrees.org/weblog/2011/11/29/many-to-many-field-save-method.html
有点相关的问题:许多关系保存后没有立即更新的问题