Django many-to-many query

Обновить

April 2019

Просмотры

768 раз

1

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

class Participation(models.Model):
    workflow_activity = models.ForeignKey('WorkflowActivity')
    user = models.ForeignKey(User)
    role = models.ForeignKey(Role)
    current = models.BooleanField()

Это многие-ко-многим «через» стол. Я хочу , чтобы фильтровать экземпляры , workflow_activityкоторые имеют либо одно из следующих условий:

  1. Нет пользователей назначены, т.е. нет записей для этого workflow_activity в таблице участия
  2. Нет текущих активных пользователей, то есть, не где все строки для workflow_activity в таблице участия есть current==False

Помощь при построении запроса будет высоко ценится!

РЕДАКТИРОВАТЬ:

Привет всем, спасибо за ответы. Я предполагаю, что им, вероятно, приближается к этому вещи неправильно. Мое требование заключается в том, что им построение своего рода система продажи билетов, которая имеет функцию автоматические присвойте которая присваивает пользователь билетов на основе некоторой логики выбора. Im запустив присвойте функцию периодической задачи (с использованием сельдерея), но для этого мне нужно выбрать билеты, которые в настоящее время Unassigned для текущего состояния билета. В настоящее время булево используется для обозначения если конкретного пользователя назначается текущему состоянию билета.

Любые идеи / мысли о реализации этого?

Edit2

Heres один я подумал:

class WorkflowActivity(models.Model):
    ...
    ...
    assigned_to = models.ManytoManyField('Participation') # older table without the current field
    current = models.ManytoManyField('Current')

class Current(models.Model):
    participant = models.ForeignKey('Participation')

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

1 ответы

1

For #1, this should work:

from django.db.models import Count

WorkflowActivity.objects.annotate(users=Count('participation__user')).filter(users=0)

Unfortunately, there isn't a good way to do #2 using only built-ins in Django's ORM. You could try extending the Count type, as suggested in Ticket 11305.

Edit:

If you are interested in finding all WorkflowActivities that have at least one active User, you can do:

WorkflowActivity.objects.filter(participation__current=True)