Django сериализатор не сохраняет данные во время создания - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь сохранить данные, создав сериализатор. У меня есть данные, переданные в качестве аргумента сериализатора, и после проверки и сохранения сериализатора я могу видеть данные, когда я print (serializer). Однако, если I print(serializer.data), часть данных отсутствует.

представление:

class TaskList(generics.ListCreateAPIView):
    serializer_class = TaskSerializer
    pagination_class = None
    permission_classes = [IsAuthenticated ]

    def get_queryset(self):
        return TaskProject.objects.all().filter(users=self.request.user)

    def create(self, request, *args, **kwargs):
        data=request.data
        projects = []
        for id in request.data['projects'].split(','):
            projects.append(Project.objects.get(id=id))
        data['projects']=projects
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer,projects)
        headers = {}
        print("serializer data",serializer.data)
        print("serializer",serializer)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer, projects):
        print(projects)
        obj = serializer.save(users=[self.request.user])
        if not self.request.user.is_superuser:
            ProjectRoleMapping.objects.create(user=self.request.user, task=obj, role=Role.objects.get_or_create(name=settings.ROLE_PROJECT_ADMIN)[0])

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

class ProjectSerializer(serializers.ModelSerializer):
    current_users_role = serializers.SerializerMethodField()

    def get_current_users_role(self, instance):
        print("p in serializer")
        role_abstractor = {
            "is_project_admin": settings.ROLE_PROJECT_ADMIN,
            "is_annotator": settings.ROLE_ANNOTATOR,
            "is_annotation_approver": settings.ROLE_ANNOTATION_APPROVER,
        }
        queryset = ProjectRoleMapping.objects.values("role_id__name")
        if queryset:
            users_role = get_object_or_404(
                queryset, project=instance.id, user=self.context.get("request").user.id
            )
            for key, val in role_abstractor.items():
                role_abstractor[key] = users_role["role_id__name"] == val
        return role_abstractor

    class Meta:
        model = Project
        fields = ('id', 'name', 'description', 'guideline', 'users', 'current_users_role', 'project_type', 'image',
                  'updated_at', 'randomize_document_order', 'collaborative_annotation')
        read_only_fields = ('image', 'updated_at', 'current_users_role')


class TaskSerializer(ProjectSerializer):

    class Meta:
        model = TaskProject
        fields = ('id', 'name', 'description', 'guideline', 'users', 'current_users_role',
                'updated_at', 'ignore_unlabeled_files', 'project_type', 'projects')
        read_only_fields = ('updated_at', 'current_users_role', 'users', 'projects')

модель:

class Project(PolymorphicModel):
    name = models.CharField(max_length=100)
    description = models.TextField(default='')
    guideline = models.TextField(default='')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    users = models.ManyToManyField(User, related_name='projects')
    project_type = models.CharField(max_length=30, choices=PROJECT_CHOICES)
    randomize_document_order = models.BooleanField(default=False)
    collaborative_annotation = models.BooleanField(default=False)

class TaskProject(Project):
    ignore_unlabeled_files = models.BooleanField(default=False)
    projects = models.ManyToManyField(SequenceLabelingProject, related_name='tasks', symmetrical=False)

печать журнала:

serializer data {'id': 18, 'name': 'abc', 'description': 'abc', 'guideline': 'Please write annotation guideline.', 'users': [1], 'current_users_role': {'is_project_admin': True, 'is_annotator': False, 'is_annotation_approver': False}, 'updated_at': '2020-03-25T03:59:47.165680Z', 'ignore_unlabeled_files': False, 'project_type': 'task', 'projects': []}

serializer TaskSerializer(context={'request': <rest_framework.request.Request object>, 'format': None, 'view': <api.views.TaskList object>}, data={'name': 'abc', 'description': 'abc', 'guideline': 'Please write annotation guideline.', 'project_type': 'task', 'projects': [<SequenceLabelingProject: asdf>, <SequenceLabelingProject: asd>], 'ignore_unlabeled_files': False, 'resourcetype': 'TaskProject'}):
    id = IntegerField(label='ID', read_only=True)
    name = CharField(max_length=100)
    description = CharField(required=False, style={'base_template': 'textarea.html'})
    guideline = CharField(required=False, style={'base_template': 'textarea.html'})
    users = PrimaryKeyRelatedField(allow_empty=False, many=True, read_only=True)
    current_users_role = SerializerMethodField()
    updated_at = DateTimeField(read_only=True)
    ignore_unlabeled_files = BooleanField(required=False)
    project_type = ChoiceField(choices=(('DocumentClassification', 'document classification'), ('SequenceLabeling', 'sequence labeling'), ('Seq2seq', 'sequence to sequence'), ('task', 'task')))
    projects = PrimaryKeyRelatedField(allow_empty=False, many=True, read_only=True)

вы можете увидеть в журнале печати для serializer.data, 'projects': [] в то время как в сериализаторе, 'projects': [<SequenceLabelingProject: asdf>, <SequenceLabelingProject: asd>], который является желаемым значением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...