Django) фильтрация запросов в соответствии с ManyToMany Relationship - PullRequest
2 голосов
/ 01 мая 2019

Я тратил часы на обработку набора запросов типа поля ManyToMany. Я хочу GET объектов (model B), которые имеют отношение ManyToMany с другим объектом (model A), используя filter на model A.

views.py

Я получаю my_user_id от urls.py, то есть str. id часть отлично работает, но ...

class UserUserId(generics.RetrieveUpdateAPIView):
    #permission_classes = (IsOwner,)
    queryset = User.objects.all()
    serializer_class = UserSerializer #serializer for User model

    def get(self, *args, **kwargs):
        id = self.kwargs['my_user_id']
        return self.queryset.filter(user_id=id).user_schedules.all()

urls.py

path('user/<str:my_user_id>', views.UserUserId.as_view()),

models.py

class User(models.Model):
    user_id = models.TextField(blank=True, null=True)
    user_schedules = models.ManyToManyField('Schedule',
            related_name='%(class)s_id')

class Schedule(models.Model):
    sched_id = models.IntegerField(blank=True, null=True)
    sched_name = models.TextField(blank=True, null=True)

Это дает мне следующую ошибку: AttributeError: у объекта 'QuerySet' нет атрибута 'user_schedules' Я попытался решить эту проблему, поставив [0] в конце filter(), но он кажется неправильным и не работает, если мне нужно проверить несколько объектов User.

Так как я могу получить user_schedules список конкретных User, чей user_id равен my_user_id?

Я застрял на этом в течение нескольких часов, любая помощь будет высоко ценится.

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Вы хотите получить данные для экземпляра, но ваш код пытается получить их из набора запросов.

Вам помогут следующие строки:

class UserUserId(generics.RetrieveUpdateAPIView):
    #permission_classes = (IsOwner,)
    queryset = User.objects.all()
    serializer_class = UserSerializer #serializer for User model

    def get(self, *args, **kwargs):
        id = self.kwargs['my_user_id']
        user = User.objects.get(id=id)
        return list(user.user_schedules.all())
2 голосов
/ 01 мая 2019

Прежде всего, я думаю, что вы, вероятно, хотите использовать другой сериализатор (что-то вроде SchedulerSerializer), так как вы предлагаете, что вы хотите сериализовать, ну, Schedule s.

Вы можете получить все Schedule s для User с данным user_id с:

class UserUserId(generics.RetrieveUpdateAPIView):
    #permission_classes = (IsOwner,)
    queryset = <b>Schedule</b>.objects.all()
    serializer_class = UserSerializer #serializer for User model

    def get(self, *args, **kwargs):
        id = self.kwargs['my_user_id']
        return self.queryset.filter(<b>user__user_id=</b>id)

Таким образом, мы запрашиваем модель Schedule и фильтруем таким образом, что получаем все Schedule с, для которых существует связанный User с user_id=id.

...