django - 覆盖 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)
解决方案
bulk_create 方法不发送 pre_save 和 post_save 信号,如果要发送信号,请使用普通 create 方法。bulk_create 警告的 Django 文档链接
推荐阅读
- java - 如何使用 Java 运行 IBM MQSI 命令?
- visual-studio-code - 如何在使用 sshfs 时启用 VS 代码扩展?
- c - Printf 不一致的结果 [The C Programming Language - Chapter 1.6 Arrays]
- python - 如何在 matplotlib 配置文件中定义次要刻度的数量
- sql - SQL - 来自另一个表的 WHERE 条件
- api - 空手道加特林报告汇总
- javascript - 有没有办法在无头浏览器中控制鼠标滚轮
- python - Pandas DataFrame 替换不适用于 inplace=True
- momentjs - momentjs 格式返回 0000-00-00
- amcharts - amCharts 4:如何处理实际差距?