gpt4 book ai didi

python - 在 Django Admin 中保存 M2M "Through"内联

转载 作者:行者123 更新时间:2023-12-03 17:59:00 28 4
gpt4 key购买 nike

显然,如果存在 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 然后保存内联中间模型?显然,一旦保存了 MyModel,Django 就可以保存直通模型 - 所以我只是在寻找一个钩子(Hook)。我尝试在调用 instance.save() 后调用 save_m2m() 来覆盖表单的 save() 方法,但显然这不适用于具有直通表的 M2M。

我正在使用 Django 1.2,但这在 1.3 中仍然是一个问题。

更新:好吧,我做了一个像上面这样的测试应用程序来隔离问题,它似乎按预期工作,在保存 MyModel 对象后正确保存了 M2M 中间对象......只要我让 Django 自动创建 MyModel.id 字段运行时 python manage.py syncdb - 一旦我添加了 GUID id 字段,它就不再起作用了。

这闻起来越来越像 Django 错误。

最佳答案

在您的 MyModelAdmin 中,您可以尝试覆盖 save_formset 方法。这样您就可以选择保存的顺序。

关于python - 在 Django Admin 中保存 M2M "Through"内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5872861/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com