我有3个模型:User,UserProfile和Programme。用户拥有所有用户的名称;
class User(AbstractUser):
first_name = model.Charfield(...)
last_name = model.Charfield(...)
...
UserProfile包含与每个用户(例如,销售经理(sm),程序经理(pm),交付经理(dm)等)相关联的属性。
class UserProfile(model.Model):
user = model.ForeignKey(User, on_delete...)
sm = model.BooleanField(default = False, editable=True...)
pm = model.BooleanField(default = False, editable=True...)
dm = model.BooleanField(default = False, editable=True...)
用户可以具有UserProfile属性的任意组合。例如: 用户1:sm 用户2:sm,pm 用户3:dm 用户4:sm,dm ...
程序中的每个程序都必须为sm,pm和dm中的每一个分配一个用户,因此我的挑战是找到一种方法,为仅限具有适当属性的Users的sm,pm和dm中的每一个生成“选择”列表。
class Programme(model.Models):
programme_name = models.Charfield(...)
AND ESSENTIALLY:
sm = only users with userprofile.sm = True
pm = only users with userprofile.pm = True
dm = only users with userprofile.dm = True
我尝试将功能添加到UserProfile中,然后在Programme中引用它:
UserProfile(model.Models):
....
def get_pm(self):
pm_list = []
pm = UserProfile.objects.filter(pm=True)
for i in pm:
pm_list.append(i.user.last_name)
return pm_list
并在计划中:
Programme(model.Models):
pm = models.Charfield(choices=UserProfile.get_pm, ...
但这会产生错误:“选择”必须是可迭代的(例如列表或元组)。
类似地,我尝试将相同的功能添加到Programmes / models.py,但这会产生相同的错误。
我知道我缺少明显的东西,但所有帮助我都很感激。
答案 0 :(得分:0)
您不需要为用户个人资料创建单独的模型:
class User(AbstractUser):
first_name = model.Charfield(...)
last_name = model.Charfield(...)
POST_CHOICES = (
('sm', ("sm")),
('sm', ("pm")),
('sm', ("dm")),
)
post=models.CharField(choices=POST_CHOICES,max_length=150, blank=True)
programme_name = models.Charfield(max_length=150, blank=True)
您可以过滤掉属于sm的用户,例如使用过滤器查询,或者为此可以使用模型管理器
答案 1 :(得分:0)
在经过大量的阅读,尝试和错误之后,出现了一个简单的解决方案:使用适当的查询简单地覆盖表单字段-
class ProgrammeCreateForm(forms.ModelForm):
class Meta:
model = Programme
fields = [
'name', 'company', 'status', 'pm', 'sm', 'dm', 'idm','start_date', 'end_date', 'delivery_type'
]
def __init__(self, *args, **kwargs):
super(ProgrammeCreateForm, self).__init__(*args, **kwargs)
sm_choices = UserProfile.objects.filter(sm=True)
pm_choices = UserProfile.objects.filter(pm=True)
dm_choices = UserProfile.objects.filter(dm=True)
idm_choices = UserProfile.objects.filter(idm=True)
self.fields['sm'] = forms.ModelChoiceField(queryset=sm_choices)
self.fields['pm'] = forms.ModelChoiceField(queryset=pm_choices)
self.fields['dm'] = forms.ModelChoiceField(queryset=dm_choices)
self.fields['idm'] = forms.ModelChoiceField(queryset=idm_choices)