исключение обратной взаимосвязи в 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 шт):
Немного разобравшись, пришел к такому коду:
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
Возможно есть еще вариант решения?
Не уверен что это самый лучший вариант, но вашу проблему скорее всего решит
person_list = Person.objects.exclude(id__in=Resource.objects.values_list('persons__id', flat=True))
Вот пример, который я использовал в своём проекте, общепринятая практика.
# Выберет всех Person, у которых resource отсутствует.
person_list = Person.objects.filter(resource__isnull=True)
Требуется написать функцию во views, которая будет делать выборку всех полььзователей, у которых еще нет ресурса
Проверено.