Использование проблемы фильтра исключения django с пустым полем m2m - PullRequest
0 голосов
/ 22 апреля 2011

Созданный мною набор запросов некорректно пропускает некоторые элементы.У меня есть три модели в Django:

class Case(models.Model):
    agents = models.ManyToManyField('UserProfile', related_name='agent_of', blank=True, null=True)
    organization = models.ForeignKey(Organization, related_name='case_org')


class UserProfile(models.Model):
    name = models.CharField(max_length=40)
    user = models.ForeignKey(User, unique=True, related_name='user_profile')
    organization = models.ForeignKey(Organization, related_name='org_members', blank=True, null=True)

class Organization(models.Model):
    name = models.CharField(max_length=75)

Я пытаюсь составить список неназначенных дел.То есть, случаи, в которых текущий пользователь не является агентом, включая случаи, когда им вообще не назначены агенты.Вот мой запрос:

Case.objects.filter(
             organization=request.user.user_profile.get().organization.id).exclude
             (Q(agents__user=request.user))

Это хорошо работает для случаев, когда им назначены другие агенты (модель UserProfile).Но он не возвращает случаи, когда им не назначен ни один агент.Я почти уверен, что это связано с тем фактом, что у дел без назначенного им агента нет строки в промежуточной таблице, соединяющей UserProfiles и Cases.

Другими словами, если у меня есть эти дела:

Дело / Агенты

Дело 1: Том, Стив

Дело 2: Стив

Дело 3: Джейн

Дело 4: никто

Мой запрос вернет Case2 и Case3, но не Case4.Попытка включить этот Case4.

Извините, если это не очень ясно, любая помощь приветствуется.

1 Ответ

1 голос
/ 22 апреля 2011

Вопрос немного неясен, но не работает ли этот запрос, чтобы получить все случаи, которые не назначены этому пользователю?

Case.objects.exclude(agents=request.user)

Если вы пытаетесь получить дела , принадлежащие организации пользователя и не назначенные ему ИЛИ НЕ назначенные никому , это должно сработать.

Case.objects.filter(Q(organization=organization)|Q(agents=None)).exclude(agents=request.user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...