如何解决如何只运行一次 django 信号以影响多个模型实例
是否可以只运行一次 django 信号以影响多个模型实例? 这个信号什么时候运行?我不想使用 crontab 库。
假设我有 10 个模型 A 的实例。 我想运行一个信号,为模型 A 的每个实例创建一个模型 B 的实例。
类似于下面的函数,但适用于所有 A 实例:
@receiver(signals.post_save,sender=A)
def create_b(sender,instance,created,**kwargs):
if created:
B.objects.create()
解决方法
您需要的是 Data Migration。
第一次运行:
python manage.py makemigrations --empty yourappname
这会在您的应用中生成一个空的迁移(这里是 yourappname),您可以参考上面链接的文档以了解它的外观。现在,您可以将自己的代码添加到迁移中以执行您想要的操作。首先,您将添加一个可以为您完成任务的函数,并使用 RunPython
将其添加到列表 operations
。最后,您的迁移应该类似于:
from django.db import migrations
def your_function(apps,schema_editor):
# We can't import the models directly as it may be a newer
# version than this migration expects. We use the historical version.
A = apps.get_model('yourappname','A')
B = apps.get_model('yourappname','B')
for a in A.objects.all():
b = B.objects.create()
# Do something with b if needed
class Migration(migrations.Migration):
dependencies = [
('yourappname','0001_initial'),]
operations = [
migrations.RunPython(your_function),]
现在,任何运行 python manage.py migrate
的人都会运行此命令并了解您希望他们所做的更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。