Python 在同一属性的多个值上筛选查询集

Python 在同一属性的多个值上筛选查询集,python,django,django-rest-framework,Python,Django,Django Rest Framework,我的models.py看起来像 class Entity(models.Model): name = models.CharField( max_length=256, verbose_name="Entity Name" ) def __str__(self): return self.name class AttributeValue(models.Model): entity = models.Foreig

我的
models.py
看起来像

class Entity(models.Model):
    name = models.CharField(
        max_length=256,
        verbose_name="Entity Name"
    )

    def __str__(self):
        return self.name

class AttributeValue(models.Model):
    entity = models.ForeignKey(
        Entity,
        on_delete=models.CASCADE,
        related_name="attribute_values"
    )
    value = models.CharField(max_length=9112,
                             verbose_name="Attribute Value")

    def __str__(self):
        return self.value

现在我不想过滤所有具有属性值
abc
def
的实体,即

for example one entity

   {
        "id": 1,
        "name": "XYZ",
        "attribute_values": [
            {
                "id": 1,
                "value": "abc",
                "entity": 1
            },
            {
                "id": 2,
                "value": "def",
                "entity": 1
            },
         ]
     }




对于单个实体,可以执行以下操作:

entity.attribute_values.filter(value__in=["abc", "def"])
对于多个实体是一个选项:

filtered_attribute_values = AttributeValue.objects.filter(value__in=["abc", "def"])
queryset = Entity.objects.prefetch_related(Prefetch('attribute_values', queryset=filtered_attribute_values))

对于单个实体,可以执行以下操作:

entity.attribute_values.filter(value__in=["abc", "def"])
对于多个实体是一个选项:

filtered_attribute_values = AttributeValue.objects.filter(value__in=["abc", "def"])
queryset = Entity.objects.prefetch_related(Prefetch('attribute_values', queryset=filtered_attribute_values))
通常,Q()对象使定义和重用条件成为可能。这允许使用|(OR)和&(and)运算符构造复杂的数据库查询;特别是,不可能在QuerySet中使用或

详细的解释在这个链接中给出

通常,Q()对象使定义和重用条件成为可能。这允许使用|(OR)和&(and)运算符构造复杂的数据库查询;特别是,不可能在QuerySet中使用或

详细的解释在这个链接中给出


下面的代码片段将筛选属性值为“abc”或“def”的所有实体:


下面的代码段将筛选属性值为“abc”或“def”的所有实体:

Entity.objects.filter(attribute_values__value__in=["abc", "def"])