首页 > 解决方案 > 覆盖 Django 模型管理器 bulk_create 方法并在每个项目上使用 pre_save 信号

问题描述

我有一个使用 custom_primary_key 作为 id 的表,它是当前表中 4 个字段的组合。我创建了一个 pre_save 信号来连接 4 个字段以将其用作 id。使用 save() 和 create() 方法可以正常工作,但我也想使用 bulk_create() 方法实现相同的逻辑,如何发送 bulk_create 中的每个项目以使用生成主键值的 pre_save 信号?

这是我试图实现的示例代码,但它似乎没有从 bulk_create 方法读取信号。

错误说:django.db.utils.IntegrityError:“id”列中的空值违反了非空约束细节:失败的行包含(null、1、2、3、4)。

class CustomManager(models.Manager):
    def bulk_create(self, objs, **kwargs):
        for obj in objs:
            pre_save.send(obj.__class__, instance=obj)
        return super().bulk_create(objs, **kwargs)
    

class MyModel(models.Model):
    objects = CustomManager()
    id = models.BigIntegerField(primary_key=True)
    field1 = models.IntegerField()
    field2 = models.IntegerField()
    field3 = models.IntegerField()
    field4 = models.IntegerField()


def generate_custom_id(sender, instance, **kwargs):
    instance.id = {}{}{}{}.format(instance.field1, instance.field2, instance.field3, instance.field4)

pre_save.connect(generate_custom_id, sender=MyModel)


   

标签: djangodjango-models

解决方案


bulk_create 方法不发送 pre_save 和 post_save 信号,如果要发送信号,请使用普通 create 方法。bulk_create 警告的 Django 文档链接


推荐阅读