Size: a a a

Django [ru] #STAY HOME

2019 November 09

NG

NIkita Gromov in Django [ru] #STAY HOME
Alexandr Stefanitsky-Mozdor
Тебе мой ответ тоже подойдет
Там нужно два родительских сериалайзера, не очень нравится такой варик
источник

AB

Alexander "PekopT" Brilliantov in Django [ru] #STAY HOME
def get_serializer_class(self):
   if self.request.method in ["PUT", "PATCH"]:
       return UpdateUserSerializer
   return UserSerializer
источник

p

pavel in Django [ru] #STAY HOME
а еще если я вьюшке делаю

def get_object(self):
   return self.request.user


я смогу как то поймать его в
serializers.ModelSerializer
?
источник

D

Dmitry in Django [ru] #STAY HOME
NIkita Gromov
Вопрос по DRF:

Я хочу что бы при GET запросе использовался один вложенный сериалайзер, а при POST/PUT другой.

При GET хочу получать:
{
 items: [
   {
     id: 1,
     name: "Name 1"
   },
   {
     id: 2,
     name: "Name 2"
   }
 ]
}

При POST:
{
 items: [1, 2, 3]
}

То есть мне нужно что бы про GET запросе родительский сериалайзер выглядел так:
class ParentSerializer(serializers.ModelSerializer):
 items = ItemsSerializer(many=True)

А при POST так:
class ParentSerializer(serializers.ModelSerializer):
 items = serializers.PrimaryKeyRelatedField(queryset=Items.objects.all(), many=True, read_only=False)
```
   def get_serializer_class(self):
       if self.request.method in SAFE_METHODS:
           return SerailizerA
       return SerializerB
источник

AS

Alexandr Stefanitsky-Mozdor in Django [ru] #STAY HOME
NIkita Gromov
Там нужно два родительских сериалайзера, не очень нравится такой варик
Это проблема сериализатора, ты можешь сделать его наследуемым
источник

D

Dmitry in Django [ru] #STAY HOME
написали уже:)
источник

NG

NIkita Gromov in Django [ru] #STAY HOME
То есть в любом случае мне нужно два разный сериалайзера?
источник

AS

Alexandr Stefanitsky-Mozdor in Django [ru] #STAY HOME
Да
источник

AS

Alexandr Stefanitsky-Mozdor in Django [ru] #STAY HOME
Просто сделай наследуемые от базового, чтобы не дублировать код
источник

AS

Alexandr Stefanitsky-Mozdor in Django [ru] #STAY HOME
Это нормальная практика в сложных проектах, особенно там, где при создании можно указать поля, которые потом нельзя менять, к примеру
источник

AS

Alexandr Stefanitsky-Mozdor in Django [ru] #STAY HOME
Пихать все в один сериализатор можно до поры до времени, но потом упретесь во что-нибудь
источник

A

Andrey in Django [ru] #STAY HOME
Alexandr Stefanitsky-Mozdor
Типо

try:
   return self.serializer_classes[self.action]
except KeyError:
   return self.serializer_class
Эм
У словаря есть метод гет....
источник

NG

NIkita Gromov in Django [ru] #STAY HOME
Andrey
Эм
У словаря есть метод гет....
да но он тут не нужен
источник

AS

Alexandr Stefanitsky-Mozdor in Django [ru] #STAY HOME
pavel
а еще если я вьюшке делаю

def get_object(self):
   return self.request.user


я смогу как то поймать его в
serializers.ModelSerializer
?
Смотря для чего. Если нужно юзера в сериализатор засунуть, то есть 2 варианта: поле сериализатора и при сохранении .save(user=self.request.uset)
источник

A

Andrey in Django [ru] #STAY HOME
Лучше эксепт написать?)
источник

AS

Alexandr Stefanitsky-Mozdor in Django [ru] #STAY HOME
Andrey
Лучше эксепт написать?)
Андрей, чего ты такой токсичный, а, предлагай решение, ели не нравится )
источник

p

pavel in Django [ru] #STAY HOME
Alexandr Stefanitsky-Mozdor
Смотря для чего. Если нужно юзера в сериализатор засунуть, то есть 2 варианта: поле сериализатора и при сохранении .save(user=self.request.uset)
источник

NG

NIkita Gromov in Django [ru] #STAY HOME
Andrey
Лучше эксепт написать?)
хотя нет ты прав мое утрверждение было неверным
Вот так действительно лучше

return self.serializer_classes.get(self.action, self.serializer_class)
источник

AB

Alexander "PekopT" Brilliantov in Django [ru] #STAY HOME
pavel
а еще если я вьюшке делаю

def get_object(self):
   return self.request.user


я смогу как то поймать его в
serializers.ModelSerializer
?
источник

p

pavel in Django [ru] #STAY HOME
спс, так делал, думал мб можно через get_object()
источник