【问题标题】:Django DRF change serializer data with CreateListModelMixinDjango DRF 使用 CreateListModelMixin 更改序列化程序数据
【发布时间】:2019-01-12 23:36:16
【问题描述】:

我有这个类视图,但我无法修改序列化器数据以插入更多数据(这是必需的并且需要自动填充)。 因为我一次创建了许多实例,所以序列化程序基于 kwargs['many'] = True。

知道如何向每个序列化程序数据添加另一个字段吗?

谢谢,

class ReservedServiceView(CreateListModelMixin, ModelViewSet):
queryset = ReservedService.objects.all()
serializer_class = ReservedServiceSerializer
authentication_classes = (authentication.TokenAuthentication,)

def perform_create(self, serializer):
    # Create an event that is a Reflection of the Reserved Service
    serializer_data = self.request.data

    for reserved_service in serializer_data:
        print("--------",reserved_service, flush=True)

        service_id = reserved_service['original_service']

        original_service = Service.objects.get(pk=service_id)

        calendar_event = CalendarEvent()
        calendar_event.name = original_service.name
        calendar_event.description = original_service.description
        calendar_event.date = reserved_service['date']
        calendar_event.type_id = 1
        calendar_event.start_time = reserved_service['start_time']
        calendar_event.end_time = reserved_service['end_time']
        calendar_event.location_id = original_service.location.id
        calendar_event.save()

        reserved_service['associated_event'] = calendar_event.id

    print("**********1", serializer_data)
    print("**********2", self.request.data)
    serializer.save()

基于:

class CreateListModelMixin(object):
def get_serializer(self, *args, **kwargs):
    """ if an array is passed, set serializer to many """
    if isinstance(kwargs.get('data', {}), list):
        kwargs['many'] = True
    return super(CreateListModelMixin, self).get_serializer(*args, **kwargs)

【问题讨论】:

  • 而且我知道如果我使用:例如 serializer.save(associated_event_id=1) ,它会起作用,但我需要为每个序列化对象保存不同的数据。不只是每个人都一样。谢谢。
  • 你的意思是每个reserved_service 在循环中,你想在每个条件下获得不同的serializer 类并保存它?
  • 是的。我最终在序列化程序中覆盖了 create,但我想在视图中执行它。我想在每个序列化器数据中注入一个额外的字段。我做到了,但是当 django 序列化数据时,它不会填充新字段(关联事件)
  • 我在代码中看到的一个错误是您正在使用 self.request.data 获取序列化程序数据,这将为您提供请求中的原始数据,而不是您在调用 @ 后获得的验证数据987654326@ 方法。所以,你应该使用serializer.validated_data而不是serailizer_data=self.request.data

标签: python django python-3.x django-rest-framework serialization


【解决方案1】:

我无法正确回答您的问题,但如果您的问题是您没有获得在视图响应中添加到序列化程序的额外字段,那么这就是它的答案。

此视图的响应由 CreateModelMixin 的 create 方法返回,该方法将 serializer.data 传递给 Responsedata 参数。您无法更新serializer.data,因为它是一个不可变对象。所以,要解决这个问题,你必须重写 create 方法,如下所示:

class ReservedServiceView(CreateListModelMixin, ModelViewSet):
    queryset = ReservedService.objects.all()
    serializer_class = ReservedServiceSerializer
    authentication_classes = (authentication.TokenAuthentication,)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        my_data = {}.update(serializer.validated_data)
        # Now you can work over the my_data and add extra fields to it and save it 
        # and instead of passing serializer.data we pass my_data to Response class
        headers = self.get_success_headers(serializer.data)
        return Response(my_data, status=status.HTTP_201_CREATED, headers=headers)

【讨论】:

  • 谢谢,我要试试这个。但是,我已经在序列化程序中做到了。您将如何决定是在视图中还是在序列化程序本身中实现它更好?你遵循什么规则?谢谢。
  • 我更喜欢在视图中做。
  • 非常感谢您的帮助。 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多