Как расширить массив или добавить значение к полю массива при обновлении кверисета в 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'))