Я пытаюсь сохранить данные, создав сериализатор. У меня есть данные, переданные в качестве аргумента сериализатора, и после проверки и сохранения сериализатора я могу видеть данные, когда я 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>]
, который является желаемым значением