Фильтрация набора запросов по нескольким значениям одного и того же атрибута - PullRequest
0 голосов
/ 27 мая 2020

Мой 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

и

 queryset = Entity.objects.all()

Теперь я не хочу фильтровать все объекты, которые имеют значения атрибутов abc и def, т.е.

for example one entity

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



Ответы [ 3 ]

2 голосов
/ 27 мая 2020

Для одного объекта вы можете сделать следующее:

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))
0 голосов
/ 27 мая 2020

Нижеприведенный фрагмент кода отфильтрует все объекты, которые имеют значения атрибутов «ab c» или «def»:

Entity.objects.filter(attribute_values__value__in=["abc", "def"])
0 голосов
/ 27 мая 2020
from django.db.models import Q

temp = AttributeValue.objects.filter( Q(value='abc') | Q(value='def') )

print(Entity.objects.prefetch_related(Prefetch('attribute_values', queryset=temp)))

В общем, объекты Q () позволяют определять и повторно использовать условия. Это позволяет создавать сложные запросы к базе данных с помощью | Операторы (ИЛИ) и & (И); в частности, иначе невозможно использовать OR в QuerySets.

Подробное объяснение дается внутри этой ссылки

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#django .db.models.Q

...