使用相关名称和管理器的Django模型查询集

时间:2018-05-15 13:17:47

标签: django django-queryset django-1.9

我有4个型号 -

class Group(models.model):
    group_id = models.CharField(max_length=10)
    name = models.CharField(max_length=20)

class User(models.model):
    user_id = models.CharField(max_length=10)
    grp = models.ForeignKey(Group, null=True, blank=True)
    user_name = models.CharField(max_length=50)
    contact_no = models.CharField(max_length=20)

class DesigType(models.model):
    desig_name = models.CharField(max_length=10)

class Designation(models.model):
    user = models.ForeignKey(User, null=True, blank=True, related_name='desigs')
    desig_type = models.ForeignKey(DesigType, null=True, blank=True, related_name='desigs')

Group模型包含用户组。 User保存每个用户的记录。 DesigType有关于“指定类型”的信息,例如管理员,团队负责人等。Designation存储确切的名称 - 例如,对于经理DesigTypeDesignation可能有项目经理或客户经理;同样,对于团队负责人DesigTypeDesignation可能会有前端领导或后端领导。

UI当前显示组下的用户列表。我想根据desig_name实现搜索功能。用户界面向我发送了group_id以及最终用户在搜索框中输入的文字,我只需要返回那些具有相应User的{​​{1}}。

我已经完成了上述操作,方法是使用desig_name返回property所拥有的desig_name列表,并检查列表中是否存在用户输入。

这是User下的property -

User

在我看来,我有一个通用的搜索功能,可以让任何用户过滤器返回适当的用户列表。

@cached_property
def desig_types(self):
    desig_types = []
    for value in self.desigs.select_related('desig_type').values('desig_type__desig_name'):
        desig_types.append(value['desig_type__desig_name'])
    return desig_types

以上代码适用于根据group = Groups.objects.get(pk=grp_id) _queryset = group.user_set.filter(**user_filter) contact_no进行过滤。对于user_namecontact_no**user_filter,对于group.user_set.filter(contact_no=user_input),则为user_name。我希望它也适用于根据group.user_set.filter(user_name=user_input)进行过滤,但我无法弄清楚如何浏览关系,所以我编写了下面的代码,检索了desig_name的列表,其中包含用户输入user_id

desig_name

然后我将过滤器传递给required_users = [] for user in group.user_set.all(): user_desig_names = user.desig_types if user_input in user_desig_names: required_users.append(user.user_id) return required_users 。但是如您所见,我必须有一个额外的代码来获取group.user_set.filter(user_id__in=required_users),而不是直接使用user_id,就像使用**user_filteruser_name一样。

有谁知道我该怎么做?

0 个答案:

没有答案