显然,如果 ManyToManyField 有中间表,Django 的 ModelAdmin/ModelForm 不允许您使用 save_m2m() 。
模型.py:
from django.db import models
def make_uuid():
import uuid
return uuid.uuid4().hex
class MyModel(models.Model):
id = models.CharField(default=make_uuid, max_length=32, primary_key=True)
title = models.CharField(max_length=32)
many = models.ManyToManyField("RelatedModel", through="RelatedToMyModel")
def save(self, *args, **kwargs):
if not self.id:
self.id = make_uuid()
super(GuidPk, self).save(*args, **kwargs)
class RelatedModel(models.Model):
field = models.CharField(max_length=32)
class RelatedToMyModel(models.Model):
my_model = models.ForeignKey(MyModel)
related_model = models.ForeignKey(RelatedModel)
additional_field = models.CharField(max_length=32)
管理员.py:
from django import forms
from django.contrib import admin
from .models import MyModel
class RelatedToMyModelInline(admin.TabularInline):
model = MyModel.many.through
class MyModelAdminForm(forms.ModelForm):
class Meta:
model = MyModel
class MyModelAdmin(admin.ModelAdmin):
form = MyModelAdminForm
inlines = (RelatedToMyModelInline, )
admin.site.register(MyModel, MyModelAdmin)
如果我先保存 MyModel,然后通过内联添加一个新的相关模型,它工作正常,但如果我尝试设置内联,同时还为新的 MyModel 添加数据,我会收到 Django 管理错误“请更正下面的错误。 ”下面没有突出显示任何内容。
如何让它保存 MyModel,然后保存内联中间模型?显然 Django 可以在保存 MyModel 后保存直通模型 - 所以我只是在寻找一个挂钩。我尝试在调用instance.save()后通过调用save_m2m()来覆盖表单的save()方法,但显然这对于带有直通表的M2M不起作用。
我使用的是 Django 1.2,但这在 1.3 中仍然是一个问题。
UPDATE:好吧,我做了一个像上面这样的测试应用程序来隔离问题,看起来它按预期工作,在保存 MyModel 对象后正确保存 M2M 中间对象...只要我让 Django 自动创建 MyModel.id 字段跑步时python manage.py syncdb
- 一旦我添加了 GUID id 字段,它就不再起作用了。
这听起来越来越像 Django bug。