TypeError: Поле 'id' ожидало число, но получило <django.db.models.fields.related_descriptors
У меня есть простое представление для показа всех текущих пользователей, которые условно фильтруются на основе типа пользователя, запрашивающего данные.
serializers.py
class MyAccountSerializer(serializers.ModelSerializer):
image = serializers.ImageField()
class Meta:
model = User
fields = ['id', 'sex', 'type', 'phone', 'image', 'email', 'student_id', 'firstname', 'middlename', 'lastname',
'image', 'joined_date', 'is_active', 'is_superuser', 'is_staff', 'last_login']
views.py
class TeacherList(generics.ListAPIView):
permission_classes = [IsAuthenticated, ]
serializer_class = ListUsersSerializer
queryset = User.objects.filter(type=User.TYPES.TEACHER)
Простой фильтр, подобный этому, работает без ошибок, но поскольку мне нужно фильтровать ответ на основе запрашивающего пользователя
вот что я хочу использовать
class TeacherList(generics.ListAPIView):
permission_classes = [IsAuthenticated, ]
serializer_class = ListUsersSerializer
# queryset = User.objects.filter(type=User.TYPES.TEACHER)
def get_queryset(self):
request = self.request.user
if request.type == User.TYPES.OWNER:
queryset = User.objects.filter(
type=User.TYPES.TEACHER, workes=request.owns)
elif request.type in [User.TYPES.STAFF, User.TYPES.DIRECTOR, User.TYPES.VICE_DIR]:
queryset = User.objects.filter(
type=User.TYPES.TEACHER, workes=request.workes)
return queryset
однако это показывает мне ошибку, которая выглядит следующим образом:
Field 'id' expected a number but got <django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x0000019D64AE7D60>.
Я подозреваю, что это как-то связано с полем "многие ко многим", из которых у меня есть одно с именем owns, которое я использую для фильтрации в 1 из условий, но не знаю, почему оно выдает ошибку
Я думаю, что вместо
queryset = User.objects.filter(
type=User.TYPES.TEACHER, workes=request.owns)
Вы должны попробовать что-то вроде:
queryset = User.objects.filter(
type=User.TYPES.TEACHER, workes__in=request.owns.all())
или
queryset = User.objects.filter(
type=User.TYPES.TEACHER, workes__in=request.owns.values_list("id", flat=True))
Он должен соответствовать всем пользователям, которые имеют все идентификаторы из request.owns ids.