Я хочу сделать что-то вроде этого:
Модель limit_choices_to = {'пользователь': пользователь}
с некоторыми отличиями.
Некоторые модели могут объяснить:
class Job(models.Model):
name = models.CharField(max_length=200)
operators = models.ManyToManyField(User)
class Activity(models.Model):
job = models.ForeignKey(Job)
job_operators = models.ManyToManyField(User, limit_choices_to={user: Job.operators} blank=True, null=True)
Примечание: синтаксис не обязательно должен корректироваться, но является иллюстративным.
Теперь у меня был некоторый успех в получении текущего пользователя с использованием промежуточного программного обеспечения, как показывают некоторые ответы на SO, однако я надеялся, что смогу получить текущее задание через request.POST, так что если Активность была сохранена, и я смог бы распознать текущее задание, и, следовательно, подмножество пользователей как операторов, которые, в свою очередь, будут выбраны пользователем в модели действий.
Другими словами, основываясь на выборе ManyToManyField в родительском поле, предложите этот суб-выбор дочернему полю или, если Джон, Джим, Джордан и Джесси работали над заданием, выберите из этих имен только опишите работу над Деятельностью в рамках этой работы и отнесите ее к ней.
Кстати, вот моя наивная попытка в промежуточном программном обеспечении:
# threadlocals middleware
try:
from threading import local
except ImportError:
from django.utils._threading_local import local
_thread_locals = local()
def get_current_user():
return getattr(_thread_locals, 'user', None)
def get_current_job():
return getattr(_thread_locals, 'job', None)
class ThreadLocals(object):
"""Middleware that gets various objects from the
request object and saves them in thread local storage."""
def process_request(self, request):
_thread_locals.user = getattr(request, 'user', None)
_thread_locals.job = getattr(request.POST["job"], 'job', None)
и модель Activity:
operators = modes.ManyToManyField(User, limit_choices_to=dict(Q(User.objects.filter(job==threadlocals.get_current_job)))
Спасибо.