Фильтр внешнего ключа в дочернем объекте
У меня есть модели: 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
, и ваш фильтр не будет соответствовать ни одной записи.
Я делаю здесь предположение, что ваши значения имеют заглавную букву.