我有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
存储确切的名称 - 例如,对于经理DesigType
,Designation
可能有项目经理或客户经理;同样,对于团队负责人DesigType
,Designation
可能会有前端领导或后端领导。
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_name
,contact_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_filter
或user_name
一样。
有谁知道我该怎么做?