【问题标题】:Filtering by ManyToMany field length: values_list() returns, but the filtering result is empty按ManyToMany字段长度过滤:values_list()返回,但过滤结果为空
【发布时间】:2020-07-22 21:10:24
【问题描述】:

我在Django有这样一个模型:

class VariantTag():                                                                                           
    saved_variants = models.ManyToManyField('SavedVariant')                                                                
    variant_tag_type = models.ForeignKey('VariantTagType', on_delete=models.CASCADE)  

然后,我正在尝试获取saved_variants 长度为2 的字段的VariantTag 模型,其中至少包含variant_ids pk 列表中的一个ID:

het_tags = (VariantTag.objects.annotate(variant_len=Count('saved_variants'))) \                                     
            .filter(saved_variants__in=variant_ids, variant_len=2)                                                      
logger.info(het_tags.all())                                                                                         
het_variant_ids = het_tags.values_list('saved_variants', flat=True)                                               
logger.info('******* het_variant_ids: {}'.format(het_variant_ids))

Logger 我得到的输出如下:

<QuerySet []>
******* het_variant_ids: <QuerySet [150, 149]>

150149 是我正在寻找的正确 ID。但是,我需要获取完整的 QuerySet 对象,如何获取它们?为什么它不起作用?

更新

两个查询条件各自独立工作,但一起应用它们会给出一个空结果。根据我在模型中不应该发生的数据。

【问题讨论】:

    标签: python sql django


    【解决方案1】:

    我不知道为什么,但重组查询首先对 ids 进行过滤,然后是注释,然后才通过 ManyToMany 字段的长度进行过滤:

    het_tags = (VariantTag.objects.filter(saved_variants__in=variant_ids)
                                  .annotate(variant_len=Count('saved_variants')))
                                  .filter(variant_len=2)
    

    如果您知道为什么会这样,请发布另一个答案。

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2011-05-15
      • 2021-10-15
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多