如何通过单条查询获取关联的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ó
相关产品推荐
相关产品推荐

