Django 多列唯一约束批量插入

2024-03-26

假设我们有一个模型

from django.db import models

class Concept(models.Model):
    a = models.CharField(max_length=255)
    b = models.CharField(max_length=255)
    c = models.CharField(max_length=255)
    d = models.CharField(max_length=255)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=('a', 'b'),
                name='first_two_constraint'),
        ]

我想执行bulk_create在此模型上,当违反“first_two_constraint”的唯一约束时,将执行更新。

对于sqlite3,特点https://github.com/django/django/blob/main/django/db/backends/sqlite3/features.py#L44 https://github.com/django/django/blob/main/django/db/backends/sqlite3/features.py#L44迫使unique_fields被传递给bulk_create功能。然而,我并不清楚那应该是什么。https://github.com/django/django/blob/829f4d1448f7b40238b47592fc17061bf77b0f23/django/db/models/query.py#L701 https://github.com/django/django/blob/829f4d1448f7b40238b47592fc17061bf77b0f23/django/db/models/query.py#L701

我尝试了约束的名称,但是失败了。跟踪,自此列表以来发生unique_fields具体来说是字段名称,并且约束不会有字段名称。https://github.com/django/django/blob/829f4d1448f7b40238b47592fc17061bf77b0f23/django/db/models/query.py#L768 https://github.com/django/django/blob/829f4d1448f7b40238b47592fc17061bf77b0f23/django/db/models/query.py#L768

结果,我不知道如何处理这个问题。

基于 sqlite3 文档,https://www.sqlite.org/lang_conflict.html https://www.sqlite.org/lang_conflict.html子标题“REPLACE”,该功能应该是可能的,因为即使它是多个列,违规仍然是唯一约束违规“当发生唯一或主键约束违规时......”

有谁对如何处理多列约束有任何见解bulk_create函数或确认唯一的方法是使用原始 SQL?

我不相信它有unique_fields=('a', 'b')因为这代表两个单独的列约束,对吗?


我也有类似的情况。我的模型字段允许我使用这个 hacky 解决方案。有效。

class Concept(models.Model):
    a = models.CharField(max_length=255)
    b = models.CharField(max_length=255)
    c = models.CharField(max_length=255)
    d = models.CharField(max_length=255)
    _a_b = models.CharField(max_length=255, editable=False, unique=True)

    def save(self, *args, **kwargs):
        # Not that this won't be helpful when doing a bulk_create so you will 
        # have to set this value when creating the bulk_create objects
        self._a_b = f"{self.a}{self.b}"
        super().save(*args, **kwargs)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=('a', 'b'),name='a_b_constraint'),
        ]

Concept.objects.bulk_create(
    concepts, # make sure to create _a_b in the loop that create this
    update_conflicts=True,
    update_fields=('c','d',),
    unique_fields=('_a_b',)
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 多列唯一约束批量插入 的相关文章

随机推荐

  • 如何在 iOS 上从相机胶卷中检索最新的照片?

    我很难弄清楚如何在没有用户干预的情况下以编程方式检索相机胶卷中的最新照片 需要明确的是 我不想使用图像选择器 我希望应用程序在打开时自动抓取最新的照片 我知道这是可能的 因为我见过类似的应用程序可以做到这一点 但我似乎找不到任何相关信息 一
  • 捕获父容器上的单击事件,但不捕获子容器上的单击事件

    用下面的例子 HTML div class parent div class child div div CSS parent align items center background blue display flex justify
  • 如何在 Flutter 中使用另一个提供程序内部的提供程序

    我想创建一个具有以下功能的应用程序authentication service根据用户角色具有不同的权限和功能 例如消息 所以我创建了一个Provider用于用户和登录管理 另一个用于用户可以看到的消息 现在 我想在用户登录时获取消息 一次
  • 实体框架 - 对唯一索引进行 UPSERT

    我对我的问题进行了一些搜索 但找不到任何真正有帮助的东西 所以我的问题 困境仍然是这样的 我知道 mysql 数据库有一个独特的索引系统 可用于使用以下格式在同一查询中插入 更新 insert into t a b c values 1 1
  • 在 AWS Cognito Oauth2 令牌中包含用户详细信息

    我正在将 AWS cognito 与 NodeJS 后端 API 结合使用 并希望在访问令牌返回中包含用户详细信息 oauth2 令牌用户池客户端应用程序中定义范围的端点 另外如果我使用管理员启动验证API 无法将范围包含在返回访问令牌中
  • Pandas date_range - 减去 numpy timedelta 给出奇怪的结果,时间变得不是 0:00:00

    我正在尝试使用 pandas date range 功能生成一组日期 然后我想迭代这个范围并从每个日期中减去几个月 确切的月份数在循环中确定 以获得新的日期 当我这样做时 我得到了一些非常奇怪的结果 MVP get date range d
  • 如何从 int 转换为泛型 Integer?

    我对 Java 比较陌生 并且习惯了 C 中的泛型 因此在处理这段代码时遇到了一些困难 基本上 我想要一个通用方法来通过按键获取存储的 Android 首选项 并且此代码虽然丑陋 但适用于布尔值 但不适用于整数 当它因 ClassCastE
  • 如何使用 Postman 查询 Exchange EWS?

    使用Postman 如何查询本地 Exchange 2016 EWS 我有 EWS 的组织 URLhttps my organization net EWS Exchange asmx 我们使用的是 Exchange 2016 没有 Off
  • 在项目之间共享自定义 PHP 代码的最佳方式

    我正在开发一个分布式环境 主要是使用 PHP 我的很多项目共享一些相同的代码 例如我的日志代码 基于 log4php 但添加了一些自定义内容 我可以在每个项目中复制粘贴此代码 但自然地 如果我更改其中的任何内容 我需要将其重新粘贴到各处并
  • 尝试创造。初始化并格式化VHD磁盘

    一些背景 我在实验室环境中工作 遇到了许多问题 需要创建 VHD 并将其附加到虚拟机以进行压力测试 我想出了一个脚本 允许用户使过程尽可能简单 如下 vms Get VM val 0 Write Host This script is se
  • 计算月份统计数据

    我有一个捐款表 我试图计算每个月的总金额 几个月没有任何捐款 我希望结果返回 0 这是我当前的查询 Donation calculate sum amount conditions gt created at gt Time now pre
  • 从服务器端应用程序向客户端推送消息?

    我有一个基于 javascript 的客户端 当前正在轮询 NET Web 服务以获取新内容 虽然轮询有效 我对这种方法不满意 因为我正在使用系统资源并在没有接收任何更改时产生开销 我的问题是如何通知我的客户有新内容可供显示 我对实施此解决
  • 使用处理的二次曲线上的点 (p5.js)

    我使用这个公式来计算二次曲线上的点 cPx2 1 t 1 t x1 2 1 t t qcX t t x2 cPy2 1 t 1 t y1 2 1 t t qcY t t y2 当我设置 t 10 并迭代曲线时 我得到 看起来它不仅获得了曲线
  • Windows 上尝试 python 多处理时出现运行时错误

    我正在 Windows 机器上使用线程和多处理来尝试我的第一个正式的 python 程序 但我无法启动进程 Python 给出以下消息 问题是 我没有在main模块 线程在类内的单独模块中处理 EDIT 顺便说一句 这段代码在 ubuntu
  • 无法使用 jQuery 委托滚动事件

    我正在尝试使用 jQuery 在特定类别的元素上触发滚动事件 如下所示 body on scroll overflow function do stuff 然而 do stuff永远不会发生 我做了一些实验 看起来好像滚动事件不能使用 on
  • 禁用 select2 清除时打开下拉菜单

    似乎 select2 4 在清除当前所选项目时默认打开下拉列表 select2 的早期版本似乎没有这种行为 我正在尝试实现它 但目前还没有运气 有谁知道如何挂钩清除事件 以便我们可以禁用它的默认行为并清除所选选项而不打开下拉列表 干杯 铝
  • 了解 Objdump 中反汇编的二进制文件 - 输出中的字段是什么

    当我使用命令 arm linux gnueabihf objdump d a out 反汇编一个简单的 ARM 二进制文件时 得到以下输出 00008480 lt start gt 8480 f04f 0b00 mov w fp 0 848
  • 返回具有 ModelState 错误的键列表

    如何返回所有有错误的键的列表 数组 我尝试执行以下操作 但它说由于某种原因我无法进行这种表达 ModelState ToList item gt item Value Errors Count gt 0 var errors from mo
  • 小书签中的 XmlHttpRequest 在 GET 上返回空响应文本?

    我正在尝试为我们构建的特殊 URL 缩短服务构建一个 javascript 书签http esv to http esv to用于缩短经文参考文献 即 马太福音 5 章 变为 http esv to Mt5 http esv to Mt5
  • Django 多列唯一约束批量插入

    假设我们有一个模型 from django db import models class Concept models Model a models CharField max length 255 b models CharField m