首页 > 解决方案 > 如何在 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 个项目)

以下是我尝试执行此操作并最终出现错误的方式

以下是我在尝试使用上述两个查询时遇到的错误消息 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

提前感谢您花时间帮助我解决这个问题。

标签: pythondjangopostgresql

解决方案


使用本机django字段是不可能的,因为https://code.djangoproject.com/ticket/26355仍然打开。为此,您可以使用django-postgres-extensionslib.

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'))

推荐阅读