如何使用一个模型作为另一种模型中“选择”的来源?

时间:2018-12-03 19:32:24

标签: django django-models

我有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,但这会产生相同的错误。

我知道我缺少明显的东西,但所有帮助我都很感激。

2 个答案:

答案 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)