python - 如何在 Django ORM 的查询集更新上扩展数组或将值附加到数组字段?[PostgreSQL]
问题描述
我有一个 ArrayField 来存储模式中给定 Dish 对象的颜色,并且菜肴也有一个类别
class Dish(models.Model):
colors = ArrayField(models.CharField(max_length=16))
category = models.CharField(max_length=32)
假设我有 15 个 Dish 对象,其中 13 个属于“Cookware”类别,其余 2 个属于“Modware”
现在我想在单个更新查询方法中将颜色附加到给定类别的现有颜色列表(必须将我的新颜色附加到匹配菜肴的所有数组字段,在我的情况下为 13 个项目)
以下是我尝试执行此操作并最终出现错误的方式
Dish.objects.filter(category="Cookware").update(colors=F("colors")+"red")
Dish.objects.filter(category="Cookware").update(colors=F("colors")+["red"])
以下是我在尝试使用上述两个查询时遇到的错误消息
No operator matches the given name and argument types. You might need to add explicit type casts
以下显然不起作用,因为apppend将返回 None
Dish.objects.filter(category="Cookware").update(colors=F("colors").append("red"))
PS:使用 Django(3.2)、Django ORM、Postgres ArrayField from django.contrib.postgres.fields import ArrayField
提前感谢您花时间帮助我解决这个问题。
解决方案
使用本机django
字段是不可能的,因为https://code.djangoproject.com/ticket/26355仍然打开。为此,您可以使用django-postgres-extensions
lib.
from django_postgres_extensions.models.fields import ArrayField
class Dish(models.Model):
colors = ArrayField(models.CharField(max_length=16))
category = models.CharField(max_length=32)
# ...
from django_postgres_extensions.models.functions import ArrayAppend
Dish.objects.filter(category="Cookware").update(colors=ArrayAppend('colors', 'red'))
推荐阅读
- aws-lambda - 如何在 CloudFormation 模板中为无服务器 API 函数定义模型
- wordpress - 根据事件日期而不是发布日期显示文章
- java - 基于系统属性在 Spring Boot 应用程序中设置配置文件
- php - PHP setcookie 函数记住选择的背景和文本颜色
- python - 使用 Brython 在网页中嵌入可运行的 Python
- mysql - 比较 MySQL 中的两个 ISO 日期时间字符串
- mapbox - Mapbox过滤器:想要根据属性键分别显示显示层
- angular - Angular 9 和 Storybook:添加 @angular/localize/init polyfill
- ethereum - 如何将代币发送到 0x 地址 - 销毁代币?
- excel - VBA复制列的最后3个单元格