Я ищу, чтобы сделать что-то вроде этого:ограничить выбор для ForeignKey с использованием промежуточного программного
Model limit_choices_to={'user': user}
с некоторыми отличиями.
Некоторые модели могут объяснить:
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 изображают, однако, я надеялся, что могу получить текущий Job через request.POST, чтобы, если активность была сохранена, я мог бы распознать текущее задание, и поэтому подмножество пользователей в качестве операторов, которое оно будет поворачивать, будет выбрано пользователем в модели Activity.
Другими словами, исходя из выбора 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)
и модель деятельности:
operators = modes.ManyToManyField(User, limit_choices_to=dict(Q(User.objects.filter(job==threadlocals.get_current_job)))
Спасибо.
Как я уже сказал, это работало с жестко закодированным pk, как еще одна иллюстрация моей цели ... Задача, конечно же, состоит в том, чтобы знать разницу pk, возможно, используя промежуточное ПО? limit_choices_to = Q (username__in = Job.objects.get (pk = 1) .operators.values ('username')) –