Django prefetch внутри метода модели

Итак, у меня есть модель Django, которая является внешним ключом для нескольких других моделей. Я хочу добавить метод к своей модели и посмотреть, есть ли у моего экземпляра модели связанные объекты. Два вопроса:

  1. Я хотел бы сделать это одним запросом, но не знаю, как использовать prefetch_related с "self". Как мне это сделать?
  2. Есть ли способ просто вернуть 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>

Ответы на ваши вопросы в обратном порядке:

  1. Канонический способ сделать это - использовать .exists() запрос:
return self.phone_set.exists() or self.laptop_set.exists()
  1. Пытаться сделать это в одном запросе бессмысленно, поскольку это разные таблицы. Тем не менее, можно попробовать воспользоваться помощником 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()
Вернуться на верх