Django中为每个Post拼接关联Group名称的实现问题求助
问题解决:Django多对多关联中GroupConcat报错修复
问题场景
在Django应用中定义了Post与Group两个多对多关联模型,需要在CBV中获取所有Post查询集,并为每个Post拼接其关联的所有Group名称。
模型代码
from django.db import models from django.utils.timezone import now from django.contrib.auth.models import User 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="group_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}"
尝试代码及报错
尝试使用GroupConcat拼接关联Group名称时:
from django_mysql.models import GroupConcat posts_with_groups = Post.objects.annotate( group_names=GroupConcat('groups__group_name') )
出现报错:
"Cannot resolve keyword 'groups' into field. Choices are: combo_post, created_at, id, insert_date..."
解决方案
错误原因是反向关联时使用了错误的关联名称。在Group模型的ManyToManyField中已经显式设置了related_name="group_post",因此从Post反向查询关联的Group时,必须使用这个指定的名称,而不是默认的group_set或错误的groups。
修正后的代码:
from django_mysql.models import GroupConcat posts_with_groups = Post.objects.annotate( group_names=GroupConcat('group_post__group_name') )
补充说明
如果在定义ManyToManyField时没有设置related_name,Django会默认生成模型名小写_set的关联名称(比如这里会是group_set),但由于已经显式指定了related_name="group_post",所以必须使用该名称进行反向关联查询。
内容的提问来源于stack exchange,提问作者Itamar
相关产品推荐
相关产品推荐

