исключение обратной взаимосвязи в Django

Есть модель пользователя:

class Person(models.Model):
    name = models.CharField('Имя', max_length=100)
    surname = models.CharField('Фамилия', max_length=100)
    patronymic = models.CharField('Отчество', max_length=100)

Есть модель ресурсов:

class Resource(models.Model):
    title = models.CharField('Название', max_length=30)
    slug =  models.SlugField('Slug', max_length=30, unique=True)
    persons = models.ManyToManyField(Person, blank=True, related_name='resource')

Требуется написать функцию во views, которая будет делать выборку всех пользователей, у которых еще нет ресурса:

def res_creater(request):
    person_list = Person.objects.filter(status='A').exclude()
    return person_list

Знаю, что написал related_name='resource', но не могу понять как вывести обратную связь. В шаблоне спокойно использую data.persons.all для вывода всех пользователей, имеющих ресурсы. Подскажите, пожалуйста, что писать в exclude() ?


Ответы (3 шт):

Автор решения: Conor McGregor

Немного разобравшись, пришел к такому коду:

def res_creater(request, slug):
    i = Resourсe.objects.get(slug=slug)
    person_list = Person.objects.filter(status='A').exclude(resource__id=i.id)
    return person_list

Возможно есть еще вариант решения?

→ Ссылка
Автор решения: 5c0rp

Не уверен что это самый лучший вариант, но вашу проблему скорее всего решит

person_list = Person.objects.exclude(id__in=Resource.objects.values_list('persons__id', flat=True))
→ Ссылка
Автор решения: Andrew Holovko

Вот пример, который я использовал в своём проекте, общепринятая практика.

# Выберет всех Person, у которых resource отсутствует.
person_list = Person.objects.filter(resource__isnull=True)

Требуется написать функцию во views, которая будет делать выборку всех полььзователей, у которых еще нет ресурса

Проверено.

→ Ссылка