在来自管理员的 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']
是空查询集。
- 提交交易
倒数第二步将取消您添加关系的意图。
在管理面板中 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']
是空查询集。 - 提交交易
倒数第二步将取消您添加关系的意图。