我对django有一个问题,我真的无法理解。被困在它上面两天并一直在寻找源头,但我找不到任何解释,希望有人比我更了解这一点!
我有两个模型,Publication
和Article
就像这样
class Publication(models.Model):
title = models.CharField(max_length=30)
articles = models.ManyToManyField('Article',blank=True)
class Meta:
db_table = 'publications'
class Article(models.Model):
headline = models.CharField(max_length=100)
class Meta:
db_table = 'articles'
当我保存新的Publication
时,我想自动保存默认文章。我做了一个脚本来测试它,它工作正常。两个对象都在各自的表中创建,一个条目写入publications_articles
表。正如所料。
publication = Publication(title='The new exciting publication')
publication.save()
publication.articles.create(headline='The article that makes the pub so exciting')
然而,这是棘手的部分。要在管理员中保存Publication
时具有相同的功能,我确实会覆盖save_model()
这样的功能。
class PublicationAdmin(admin.ModelAdmin):
list_display = ['title']
def save_model(self, request, obj, form, change):
if not change:
obj.save()
obj.articles.create(headline='The article that makes this pub so exciting')
else:
obj.save()
在管理员中保存Publication
会同时创建Publication
和Article
,但publications_articles
表中没有条目将它们捆绑在一起!
有人请,请解释一下这种行为。我即将做一个原始的sql-insert只是为了解决这个问题,但我想了解为什么实体之间没有连接。
答案 0 :(得分:0)
如果您通过save_model
末尾的代码进行调试,您会注意到save_related
之后立即调用。此方法检查输入的Publication
表单是否输入了相关数据的任何表格。由于文章是通过代码添加的,因此它不会在publications_articles
表中向数据库提交任何值。
在覆盖save_model
方法结束时,您还会注意到obj.articles.count()
返回1,但此时表中没有插入任何值。
最好覆盖save_related
:
def save_related(self, request, form, formsets, change):
form.save_m2m()
for formset in formsets:
self.save_formset(request, form, formset, change=change)
if not change and not formsets
form.instance.articles.create(headline='The article that makes this pub so exciting')