Я хочу написать собственный метод get_queryset () для сериализатора на основе параметров запроса.
Вот мой сериализатор:
class SearchRequestSerializer(serializers.Serializer):
name = serializers.CharField(max_length=255, required=False)
nickname = serializers.RegexField(
r'^(?!(.*?\_){2})(?!(.*?\.){2})[A-Za-z0-9\._]{3,24}$',
max_length=24,
min_length=3,
required=False,
)
modelA_id = serializers.CharField(max_length=11, min_length=11,
required=False)
def validate_modelA_id(self, value):
queryset = modelA.objects.filter(id=value)
if queryset.exists():
return queryset.first()
else:
raise serializers.ValidationError(_('Not found'))
Если объект модели A существует - проверка вернет экземпляр,Но я не хочу выполнять тот же запрос в get_queryset () в моей ветви if.
def get_queryset(self):
name = self.request.query_params.get('name', None)
nickname = self.request.query_params.get('nickname', None)
queryset = User.objects.filter(Q(name__contains=name)|Q(nickname__contains=nickname))
if 'modelA_id' in self.request.query_params:
# in this case will be annotated extra field to queryset
# extra field will be based on 'modelA' instance which should be returned by serializer
return queryset
Я нашел только одно решение - добавьте следующую строку в мой метод GET:
self.serializer = self.get_serializer()
Чем можно будет получить проверенные значения в моемметод get_queryset ().Но PyCharm не нравится это решение