переопределить создание в сериализаторе - PullRequest
0 голосов
/ 21 февраля 2019

Я переопределяю метод create в сериализаторе, но кажется, что он не попадает в эту функцию, когда я выполняю запрос POST:

Мой сериализатор:

class ElsUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = ElsUser
        fields = ['id', 'first_name', 'last_name', "email"]
        read_only_fields = ['id']

class RequisiteItemSerializser(serializers.ModelSerializer):
    created_by = ElsUserSerializer()

    class Meta:
        model = RequisiteItem
        fields = ['id', 'enrollable', 'completed_within_days', 'completed_within_type','date_completed_by', 'created_by' ]
        read_only_fields = ['id']


class RequisiteSerializer(serializers.ModelSerializer):
    created_by = ElsUserSerializer()
    items = RequisiteItemSerializser(many=True)

    class Meta:
        model = Requisite
        fields = ('id', 'name', 'description', 'items', 'enrolments', 'created_by', 'timestamp')
        read_only_fields = ['id']
        depth = 1

    def create(self, validated_data):
        print("SELF INTITIAL DATA", self.initial_data)
        helper = RequisiteHelper()
        requisite = helper.create(self.initial_data,self.context['request'])
        print("LOGGES IN USER", self.context['request'].user.username)

        return requisite

Я переместил методык отдельному вспомогательному классу:

Мой вспомогательный класс:

class RequisiteHelper:
    def create(self, initial_data, context):
        name = initial_data['name']
        description = initial_data['description']
        items = initial_data['items']
        enrolments = initial_data['enrolments']
        requisite = Requisite.objects.create(name=name, description=description, created_by=context.user)
        self.create_items(requisite, items, context)
        self.create_enrolments(requisite, enrolments)
        requisite.save()
        return requisite

def create_items(self, requisite, items, context):
    for item in items:
        requisite_item = RequisiteItem()
        enrollable = Enrollable.objects.get(id=item.enrollable.id)
        requisite_item.enrollable = enrollable
        requisite_item.created_by = context.user
        requisite_item.completed_within_days = item.completed_within_days
        cw_type = CompletedWithinType.objects.get(short_name = item.completed_within_type)
        requisite_item.completed_within_type = cw_type
        requisite_item.save()
        requisite.items.add(requisite_item)

def create_enrolments(self, requisite, enrolments):
    for enrolment in enrolments:
        requisite.add(enrolment)

Когда я создаю метод Requisite by post, он продолжает показывать, что созданный_обязателен.Я сохраняю create_by автоматически как зарегистрированного пользователя, переопределяя метод create.Операторы печати также не отображаются.Что я могу делать не так?

В views.py у меня есть:

   class ListCreateRequisite(generics.ListCreateAPIView):
       serializer_class = RequisiteSerializer
       queryset = Requisite.objects.all()

1 Ответ

0 голосов
/ 21 февраля 2019

Вы create метод не вызывается, потому что created_by проверка поля модели для поля require-field перехватывается перед ним при вызове serailizer.is_valid().Вам нужно присвоить это значение перед вызовом сериализатора или во время выполнения, или даже вы можете изменить требования create_by при определении модели.Это позволит вам обойти этот улов.

...