You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单条查询获取关联的Tag对象?

问题背景

模型定义:

class Tag(BaseModel):
    tag_name = models.CharField(max_length=250)
    slug = models.SlugField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.tag_name)
        super(Tag, self).save(*args, **kwargs)

    def __str__(self):
        return str(self.tag_name)


class Tags(BaseModel):
    filtertype = models.CharField(max_length=250)
    tags = models.ManyToManyField(Tag)

当前实现(两条查询):

def get(self,request,version):
    filtertype = request.query_params.get('filtertype', '')
    filtertypes = filtertype.split(",")

    tagsList = Tags.objects.filter(filtertype__in=filtertypes).values_list('tags', flat=True).distinct()
    queryset = Tag.objects.filter(id__in=tagsList)

    context = {"request": request}
    serialized = TagListSerializers(queryset, many=True, context=context)
    return Response(serialized.data)
单查询实现方案

直接利用Django的跨表关联查询能力,通过Tag模型反向关联Tags表,一次查询即可获取目标数据:

def get(self,request,version):
    filtertype = request.query_params.get('filtertype', '')
    filtertypes = filtertype.split(",")

    # 单条跨表查询,自动去重避免重复Tag
    queryset = Tag.objects.filter(tags__filtertype__in=filtertypes).distinct()

    context = {"request": request}
    serialized = TagListSerializers(queryset, many=True, context=context)
    return Response(serialized.data)

说明:

  • tags__filtertype__in=filtertypes:通过Tag模型的反向关联(对应Tags表的tags字段),直接过滤出关联filtertype符合条件的Tag对象
  • .distinct():因为多对多关联可能导致同一Tag被多次匹配,用这个方法去重,保证结果唯一性

内容的提问来源于stack exchange,提问作者V. Bujdosó

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:14:38