Как выбрать все объекты, которые не находятся во многих отношениях в Django - PullRequest
2 голосов
/ 18 марта 2011

В приложении есть следующие (возобновленные) модели:

class Account(models.Model):
    name = models.CharField(max_length=64)
    plans = models.ManyToManyField('Plan')
    extra_services = models.ManyToManyField('Service')

class Plan(models.Model):
    name = models.CharField(max_length=64)
    services = models.ManyToManyField('Service')

class Service(models.Model):
    name = models.CharField(max_length=64)

План - это просто совокупность услуг, но учетная запись может иметь отдельные службы. В admin (Аккаунт) Я хочу показать поле выбора со всеми Сервисами (extra_services), которые НЕ СВЯЗАНЫ с каким-либо Планом. Какой лучший набор запросов я могу использовать для получения этого (в limit_choices_to)?

PS: я не хочу перебирать все планы, чтобы получить все идентификаторы сервисов, которые связаны, и после этого исключить их в фильтре.

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Service.objects.filter(plan_set__isnull=True) должен сделать.

Дальнейшее объяснение можно найти в документации .

0 голосов
/ 18 марта 2011

ОК, я получил это с помощью необработанного SQL-запроса:

services = Service.objects.raw('SELECT * FROM accounts_service WHERE id NOT IN(SELECT service_id FROM accounts_plan_services);')

В любом случае, я могу сделать это без необработанного SQL-запроса?

...