Есть ли запрос на фильтрацию, основанный на существовании отношения один-к-одному в django? - PullRequest
0 голосов
/ 03 января 2012

Рассмотрим схему модели:

class A(models.Model):
  id = models.IntegerField(...)
  ...

class B(models.Model):
  parent = models.OneToOneField(A, primary_key=True)

И далее предположим, что строк A больше, чем B (например, не все As имеют подробности).Как бы я сгенерировал запрос, который дает мне только As, с которыми связаны B?A.

Ответы [ 4 ]

0 голосов
/ 04 января 2012

Так как все B должны иметь A (и обратное неверно):

B.objects.filter(parent__isnull=False)

Отношения один-к-одному. Концептуально это похоже на ForeignKey с уникальным = True, но "обратная" сторона отношения будет напрямую возвращать один объект.

0 голосов
/ 03 января 2012

Что у вас должно работать.Просто проверил это сам по обратному отношению OneToOneField в моем собственном приложении.Однако я никогда не пробовал делать это на OneToField, который также является первичным ключом.Возможно, что по какой-то причине это портит запрос.Это небольшая дополнительная работа только для проверки теории, но вы можете попробовать использовать стандартный AutoField (или позволить Django создать его автоматически, удалив primary_key) в качестве первичного ключа, и посмотреть, сработает ли тогда ваш запрос.

0 голосов
/ 04 января 2012

Я только что попробовал это, и это работает для меня:

A.objects.exclude(b=None)

или несколько более хакерская версия, которая использует (обычно) целочисленный неотрицательный характер первичных ключей

A.objects.filter(b__id__gte=0)

Теперь у меня есть related_name, поэтому, если они вам не подходят, попробуйте добавить related_name.

class Profile(models.Model):
    user   = models.OneToOneField(User, related_name='profile')
0 голосов
/ 03 января 2012

Если это OneToOne, нет менеджера, только сам объект. Так что это должно быть A.B, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...