Django Rest Framework разные сериализаторы для моделей - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть модель, например:

 def SomeModel(models.Model):
     serial_num = models.IntegerField(unique=True)
     count = models.IntegerField()

И мне нужно создать 2 URL, которые будут работать с этой моделью.Но должно быть 2 разных сериализатора.Например:

  • Для первого URL-адреса пользователя должны быть оба поля (serial_num и count). Для второго URL-адреса пользователя должны быть только одно поле (количество).
  • Во втором случае serial_num будет сгенерирован в классе Serializer.

Это хорошая практика для создания двух разных сериализаторов для одной модели?

А также вопрос, как насчет проверки?

Поле «count» зависит от другой модели.Я думал поставить валидацию в класс сериализатора.Но я не хочу иметь 2 одинаковых блока кода проверки в 2 разных классах сериализаторов (для обоих URL).

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Создайте два сериализатора и назначьте каждое из ваших представлений этому конкретному сериализатору.

например, представьте, что у вас есть два пути, такие как path1 и path2:

class MyModelViewSet(ModelViewSet):
    serializer_class = Serializer1
    queryset = YourModel.objects.all()

    @action(methods=['post'], detail=False, url_path='path1', serializer_class=Serializer1)
    def path1_view(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        .....

    @action(methods=['post'], detail=False, url_path='path2', serializer_class=Serializer2)
    def path2_view(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        .....

и для сериализаторов:

class Serializer1(ModelSerializer):
    class Meta:
        model = SomeModel
        fields = ('serial_num', 'count',)

class Serializer2(ModelSerializer):
    class Meta:
        model = SomeModel
        fields = ('count',)

    def validate(self, attrs):
        # Update attrs with serial_num here
        return attrs
0 голосов
/ 30 декабря 2018

Я нашел подход, который может быть более полезным.Используйте сервисы для бизнес-логики.Пример можете прочитать здесь: https://github.com/HackSoftware/django-styleguide#examples

0 голосов
/ 27 декабря 2018

Вы должны использовать два сериализатора и использовать наследование для общей логики проверки.

...