Django prefetch внутри метода модели
Итак, у меня есть модель Django, которая является внешним ключом для нескольких других моделей. Я хочу добавить метод к своей модели и посмотреть, есть ли у моего экземпляра модели связанные объекты. Два вопроса:
- Я хотел бы сделать это одним запросом, но не знаю, как использовать prefetch_related с "self". Как мне это сделать?
- Есть ли способ просто вернуть True или False, если связанная модель существует? Например, следует ли мне просто использовать first? (Кажется, я помню, что есть "правильный" способ сделать это, но это было давно, и я, возможно, запоминаю колбу.)
Пример кода:
from django.db import models
class Person(models.Model):
# <fields>
def has_device(self):
# ***prefetch related phones and laptops***
if self.phone_set.first() or self.laptop_set.first():
return True
return False
class Laptop(models.Model):
owner = models.ForeignKey(Person)
# <fields>
class Phone(models.Model):
owner = models.ForeignKey(Person)
# <fields>
Ответы на ваши вопросы в обратном порядке:
- Канонический способ сделать это - использовать
.exists()
запрос:
return self.phone_set.exists() or self.laptop_set.exists()
- Пытаться сделать это в одном запросе бессмысленно, поскольку это разные таблицы. Тем не менее, можно попробовать воспользоваться помощником
prefetch_related_objects
:
from django.db.models import prefetch_related_objects
...
def has_device(self):
prefetch_related_objects([self], "phone_set", "laptop_set")
return self.phone_set.exists() or self.laptop_set.exists()