를 사용하여 외래 키합니다 : 약간의 차이와제한 선택은 내가 이런 식으로 뭔가를 찾고 있어요 미들웨어
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을 얻을 수 있기를 바랍니다 .POST, if 활동이 저장되면 현재 작업을 식별 할 수 있으므로 사용자의 하위 집합이 연산자로 선택되며 사용자가 활동 모델에서 선택할 수 있습니다.
즉, 상위 필드의 ManyToManyField를 기반으로 해당 하위 선택을 하위 필드에 제공하거나 John, Jim, Jordan 및 Jesse이 작업을 수행 한 경우 해당 이름에서만 선택하십시오 해당 작업 내에서 활동에 대한 작업을 설명합니다.
# 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)))
감사합니다
BTW, 여기 내 순진 미들웨어의 시도이다.
제쳐두고, 저는 이것을 하드 코딩 된 pk와 함께 사용하는 것이 내 목표를 더 잘 보여 주었다는 것을 알았습니다 ... 당연히 미들웨어를 사용하여 pk를 식별하는 것이 당연한 일입니까? limit_choices_to = Q (username__in = Job.objects.get (pk = 1) .operators.values ('username')) –