django ORM - исключить на M2M с не работающей F-функцией - PullRequest
2 голосов
/ 25 марта 2020

У меня есть следующие модели:

class Activity(models.Model):
   user = models.ForeignKey(User, related_name='activities')
   project = models.ForeignKey(Project, related_name='activities')


class Project(models.Model):
   assignees = models.ManyToManyField(User, related_name='projects')

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

Мой запрос:

Activity.objects.exclude(project__assignees=F('user'))

Проблема в том, что я всегда получаю эту ошибку:

django .db.utils.OperationalError: (1054, «Неизвестный столбец« U2.id »в« on »в '')

Я работаю над django 2.2.11 и MySQL.

Я нашел пару старых django ошибок , но они должны быть исправлены с незапамятных времен.

Есть идеи, как решить мою проблему? Моя таблица активности огромна, и мне нужен эффективный способ. И я был бы рад не использовать необработанные запросы.

Спасибо!

1 Ответ

2 голосов
/ 25 марта 2020

Похоже, что это ошибка, поскольку в сгенерированном запросе таблица U2 даже не определена. Возможно, вы захотите подать билет в билетную систему Django .

Однако вы можете решить проблему, добавив аннотации и затем отфильтровав:

from django.db.models import Exists, OuterRef

Activity.objects.annotate(
    <b>valid=</b>~Exists(Project.objects.filter(
        activities=OuterRef('pk'),
        assignees=OuterRef('user')
    ))
).filter(<b>valid=True</b>)

или Начиная с , вы можете напрямую фильтровать по Exists:

from django.db.models import Exists, OuterRef

Activity.objects.filter(
    ~Exists(Project.objects.filter(
        activities=OuterRef('pk'),
        assignees=OuterRef('user')
    ))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...