Как выполнить аннотацию в модели Django с отношением "многие ко многим"?

У меня есть две модели Django под названием Restaurant и RestauranCategory. Модель Ресторан имеет отношение "многие-ко-многим" к модели RestaurantCategory. Пожалуйста, обратитесь к прилагаемому образцу модели.

class RestaurantCategory(BaseModel):
   name = models.CharField(max_length=150)
   description = models.TextField()

class Restaurant(BaseModel):
    name = models.CharField(db_index=True, max_length=128)
    is_partner = models.BooleanField(default=True)
    category = models.ManyToManyField(
      RestaurantCategory,
      related_name="restaurant_categories",
      blank=True,
      db_index=True,
    )

Теперь мне нужно выполнить аннотацию из RestaurantCategory, чтобы иметь новый столбец под названием restaurant_names и присвоить ему единственную строку, содержащую все связанные названия ресторанов. Я добавил аналогичную вещь, которую мне нужно сделать

new_data = RestaurantCategory.objects.all().annotate(
  restaurant_names=<should contain all the restaurant names in a single string>
)

Можно ли этого добиться с помощью аннотирования? Если нет, то какие варианты мы можем использовать? Я просмотрел это вопрос на StackOverflow и не смог получить хорошую идею относительно моего вопроса.

Как сказал @Truegopnik, вам нужно использовать StringAgg вместе с F-выражением. Однако документация StringAgg немного слаба и не содержит примеров. Вот как это можно сделать с вашими моделями:

from django.contrib.postgres.aggregates import StringAgg
from django.db.models import F

new_data = RestaurantCategory.objects.annotate(
    restaurant_names=StringAgg(F('restaurant_categories__name'), ', ')
)
Вернуться на верх