首页 > 解决方案 > 查找两个不同模型的两个查询集的交集

问题描述

我的 models.py 看起来像

class RelevanceRelation(TimeStampable, SoftDeletable, models.Model):
    relevance_type = models.ForeignKey(
        RelevanceType,
        on_delete=models.CASCADE,
        related_name="relevance_relations"
    )
    name = models.CharField(max_length=256,
                            verbose_name="Relevance Relation Name")

    def __str__(self):
        return self.name


class RelevanceRelationValue(TimeStampable, SoftDeletable, models.Model):
    entity = models.ForeignKey(
        Entity, on_delete=models.CASCADE,
        related_name="relevance_relation_values"
    )
    relevance_relation = models.ForeignKey(
        RelevanceRelation,
        on_delete=models.CASCADE,
        related_name="values"
    )
    name = models.CharField(max_length=256,
                             verbose_name="Relevance Relation Value")

    def __str__(self):
        return self.name

我有两个查询集

q1 = RelevanceRelationValue.objects.filter(entity=<int>)
q2 = RelevanceRelation.objects.filter(relevance_type=<int>)

现在有没有办法找到和的交集,q1q2我不想显示q2其中id存在的所有值q1 as rulevance_relation

例如:

q1 = -------------------------------
     | entity | relevance_relation |
     -------------------------------
     |   1    |        1           |
     |   1    |        2           |
     |   1    |        3           |
     -------------------------------

and q2 = -------------------------------
         |   id.  | relevance_type     |
         -------------------------------
         |   1    |        1           |
         |   2    |        1           |
         |   3    |        1           |
         |   4    |        1           |
         |   5    |        1           |
         |   6    |        1           |
         ------------------------------- 

so q3 should be 
         -------------------------------
         |   id.  | relevance_type     |
         -------------------------------
         |   1    |        1           |
         |   2    |        1           |
         |   3    |        1           |
         ------------------------------- 

标签: pythondjangodjango-rest-framework

解决方案


您可以执行额外的过滤:

q1 = RelevanceRelationValue.objects.filter(entity=some_value1).values('relevance_relation')
q2 = RelevanceRelation.objects.filter(
    relevance_type=some_value2,
    id__in=q1
)

但简单地过滤相关模型更有意义,所以:

RelevanceRelation.objects.filter(
    values__entity=some_value1,
    relevance_type=some_value2
).distinct()

因此,在这里我们得到了所有RelevanceRelations存在relevance_type的s ,以及存在关联的所有 s 。some_value2 RelevanceRelationValueentity=some_value1


推荐阅读