Как расширить массив или добавить значение к полю массива при обновлении кверисета в Django ORM? [Postgresql]

У меня есть ArrayField для хранения Colors для данного объекта Dish в схеме, и у блюд также есть категория

class Dish(models.Model):
   colors = ArrayField(models.CharField(max_length=16))
   category = models.CharField(max_length=32) 

Допустим, у меня есть 15 предметов посуды, из которых 13 принадлежат к категории "Посуда", а оставшиеся 2 - к "Изделиям"

Теперь я хочу добавить цвет к существующему списку цветов для данной категории в одном методе запроса обновления (который должен добавить мой новый цвет ко всем полям массива подходящих блюд, 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'))
Вернуться на верх