У меня 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
может иметь отведение переднего или заднего отведения.
В настоящее время пользовательский интерфейс отображает список пользователей в группе.Я хочу реализовать функцию поиска в соответствии с desig_name
.Пользовательский интерфейс отправляет мне group_id
и текст, введенный конечным пользователем в поле поиска, и я должен вернуть только те User
с соответствующими desig_name
.
, которые у меня уже есть.проделайте вышеупомянутое, используя property
, чтобы вернуть список desig_name
s, которые есть у 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
s, для которых пользователь ввел 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
s вместо прямого использования **user_filter
, как с user_name
или contact_no
.
Кто-нибудь знает, как я могу это сделать?