我想做这样的事情:
模型 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)
和活动模型:
operators = modes.ManyToManyField(User, limit_choices_to=dict(Q(User.objects.filter(job==threadlocals.get_current_job)))
谢谢你。