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

Create M2M Relationship in post_save Signal from Admin

在管理面板中 post-保存信号期间创建 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

当您使用默认 Blog 管理页面添加新博客 post 时,您还包括要保存的 M2M 关系。 Django 将使用您在表单中提交的值创建博客 post:

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

  • 在一次交易中包含所有内容
  • 通过实例化表单并保存来创建博客对象。
  • 调用 post_save() 将触发您的接收器并创建 2 篇文章及其关系
  • 使用您在创建博客时指定的关系在表单上调用 save_m2m(),假设您没有 select 任何东西,这就没有关系。 form.cleaned_data['articles'] 是空查询集。
  • 提交交易

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