Набор запросов модели Django с использованием связанных имен и менеджеров - PullRequest
0 голосов
/ 15 мая 2018

У меня 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.

Кто-нибудь знает, как я могу это сделать?

...