Django - объединить все группы для каждого поста
У меня есть 2 модели в моем приложении Django:
models.py:
class Post(models.Model):
id = models.CharField(verbose_name="Post ID", max_length=1200, primary_key=True)
post_name = models.CharField(
verbose_name="Post Name",
max_length=1000,
blank=True,
null=True,
)
post_description = models.TextField(
verbose_name="Post Description",
max_length=600,
null=True,
blank=True,
)
platform = models.CharField(
verbose_name="Platform",
max_length=25,
null=True,
blank=True,
)
type_dropdown = (
("Carousel ads", "Carousel ads"),
("Image ads", "Image ads"),
("Video ads", "Video ads"),
("Lead ads", "Lead ads"),
("Follower ads", "Follower ads"),
)
type = models.CharField(
verbose_name="Type",
max_length=15,
blank=True,
null=True,
choices=type_dropdown,
default="Type 1",
)
link = models.URLField(
verbose_name="Link",
max_length=4000,
blank=True,
null=True,
)
created_at = models.DateTimeField(default=now, null=True, blank=True)
insert_date = models.DateTimeField(null=True, blank=True)
user_last_update = models.ForeignKey(
User,
on_delete=models.PROTECT,
null=True,
blank=True,
)
updated_at = models.DateTimeField(auto_now=True, null=True, blank=True)
def __str__(self):
return f"{self.post_name}"
class Group(models.Model):
group_name = models.CharField(
verbose_name="Group Name",
max_length=150,
blank=True,
null=True,
)
post = models.ManyToManyField(
Post,
related_name="combo_post",
)
created_at = models.DateTimeField(default=now, null=True, blank=True)
insert_date = models.DateTimeField(null=True, blank=True)
user_last_update = models.ForeignKey(
User,
related_name="combo_user",
on_delete=models.PROTECT,
null=True,
blank=True,
)
updated_at = models.DateTimeField(auto_now=True, null=True, blank=True)
def __str__(self):
return f"{self.group_name}"
Я использую CBV (Django Class-Based Views) и хочу получить набор запросов всех постов с другим столбцом, который объединяет все группы для каждого поста. Как я могу это сделать?
Я пробовал этот, но не получилось:
from django_mysql.models import GroupConcat
posts_with_groups = Post.objects.annotate(
group_names=GroupConcat('groups__group_name')
)
я получил эту ошибку: "Невозможно преобразовать ключевое слово 'groups' в поле. Варианты: combo_post, created_at, id, insert_date..."
По умолчанию related_query_name
[Django-doc] из ForeignKey
является исходной моделью, поэтому group
, а не :groups
from django_mysql.models import GroupConcat
posts_with_groups = Post.objects.annotate(
group_names=GroupConcat('group__group_name')
)
Согласно вашей помощи, я хочу поделиться ответом:
views.py:
from django.db.models import Value, CharField
def get_queryset(self):
posts_with_groups = Post.objects.annotate(
groups=StringAgg(
F("group_post__group_name"), delimiter=", ", output_field=CharField()
)
)
queryset = posts_with_groups
print("My type:", type(queryset))
return queryset