在来自管理员的post_save信号中创建M2M关系

时间:2019-09-09 15:08:58

标签: python django django-signals

在管理面板中的保存后信号期间创建M2M关系的正确方法是什么?我有下面的代码。它成功创建了两个Articles和一个Blog,但没有保存两者之间的关系。

## models.py
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver


class Article(models.Model):
    title = models.CharField(max_length=250)


class Blog(models.Model):
    title = models.CharField(max_length=250)
    articles = models.ManyToManyField(Article, blank=True)

    def set_related_articles(self):
        article_titles = ['a', 'b']
        for title in article_titles:
            _blog = Article(title=title)
            _blog.save()
            self.articles.add(_blog)


@receiver(post_save, sender=Blog)
def blog_post_save(sender, instance, **kwargs):
    instance.set_related_articles()

## admin.py
from django.contrib import admin
from .models import Blog


@admin.register(Blog)
class BlogUploadAdmin(admin.ModelAdmin):
    pass

1 个答案:

答案 0 :(得分:1)

使用默认的Blog管理页面添加新博客帖子时,您还将包括要保存的M2M关系。 Django将使用您以以下形式提交的值来创建Blog帖子:

enter image description here

管理员的工作方式是按此顺序执行操作,因为它使用的是ModelForm

  • 在一次交易中包装所有内容
  • 通过实例化表单并将其保存来创建博客对象。
  • 调用post_save(),它将触发您的接收器并创建2条文章以及与之的关系
  • 使用创建博客时指定的关系在表单上调用save_m2m(),如果您未选择任何内容,则没有关系。 form.cleaned_data['articles']是空的查询集。
  • 提交交易

倒数第二步将取消您添加关系的意图。