私はこのようなことをしようとしています:
モデル 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に関するいくつかの回答が示すように、ミドルウェアを使用して現在のユーザーを取得することにある程度成功しましたが、アクティビティが保存された場合、request.POSTを介して現在のジョブを取得できることを望んでいました、現在のジョブを識別することができるため、オペレーターとしてのユーザーのサブセットが、アクティビティモデルで選択するユーザーセットになります。
つまり、親フィールドの 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)
そしてActivityモデル:
operators = modes.ManyToManyField(User, limit_choices_to=dict(Q(User.objects.filter(job==threadlocals.get_current_job)))
ありがとうございました。