Фильтр внешнего ключа в дочернем объекте

У меня есть модели: Boss - Shop - Employee - WorkSpace


class Boss(models.Model):
    fullname = models.TextField()

class Shop(models.Model):
    name = models.TextField()
    address = models.TextField()
    phone = models.TextField()
    boss = models.ForeignKey(
        Boss, on_delete=models.CASCADE, related_name="shops"
    )

class Employee(models.Model):
    name = models.TextField()
    phone = models.TextField()
    shop = models.ForeignKey(
        Shop, on_delete=models.CASCADE, related_name="employees"
    )
class WorkSpace(models.Model):
    name = models.TextField()
    employee = models.ForeignKey(
        Shop, on_delete=models.CASCADE, related_name="work_spaces"
    )

Я фильтрую с помощью Boss.objects.filter(shops__employees__work_spaces__type=C1) и получил:

{
    "shops": [
        {
            "id": 32,
            "name": "Garden flowers",
            "address": "5 st. Hool-Maa",
            "phone": "879124851861598",
            "employees": [
                {
                    "id": 150,
                    "name": "Mike",
                    "phone": "8154451246",
                    "work_spaces": [
                        {
                            "id": 497,
                            "type": "B12"
                        },
                        {
                            "id": 15,
                            "type": "Z5"
                        },
                        {
                            "id": 33,
                            "type": "C1"
                        }
                    ]
                }
            ]
        }
    ]
}

Но мне нужен только C1 из work_spaces:

                [{
                  "id": 33,
                  "type": "C1"
                }]

Как я могу исключить другие рабочие_пространства из набора запросов или мне нужно преобразовать результат в список и затем отфильтровать с помощью цикла for? Рабочих пространств может быть много, и мне не нужно показывать их все пользователю, мне нужна информация о начальнике, магазине, сотруднике...

Попробуйте использовать кавычки вокруг C1 ?

Нравится :

Boss.objects.filter(shops__employees__work_spaces__type="C1").

В противном случае, не могли бы вы поделиться определением вашего поля type ?

Также, но это только мое мнение, это плохая идея - называть атрибут именем функции built-in. Здесь я бы не стал использовать слово "тип" для названия этого атрибута.

Согласно вашему представлению, вы применяете метод lower() на workspace_type.

Таким образом, если у вас есть workspace_type=C1, применение lower() сделает workspace_type=c1, и ваш фильтр не будет соответствовать ни одной записи.

Я делаю здесь предположение, что ваши значения имеют заглавную букву.

Вернуться на верх