【问题标题】:Django RestFramework Error Associate with DateTimeField Serializer on POST RequestDjango Rest Framework 错误与 POST 请求上的 DateTimeField 序列化程序相关联
【发布时间】:2016-12-05 16:27:02
【问题描述】:

基于下面的 Serializer、Mixin 和 View,我能够通过 GET 请求成功检索 JSON 数据(见下文),但是当我尝试通过 Django Restframework 执行 JSON POST 时收到"AttributeError: 'NoneType' object has no attribute 'request'" 和我不知道为什么。请帮忙。我还添加了给我错误的 TransactionDateTime 模型和 JSON POST 请求。我正在使用 Postman 发送请求。提前致谢。我的猜测是我的问题出在 serializers.DateTimeField 上,因为我使用下面的

通过 Django shell 成功插入了数据
my_date = datetime.strptime('2015-01-28 05:30:00', '%Y-%m-%d %H:%M:%S')

请查看下面的序列化程序,通过 GET 请求、Mixin、View、Model 和 POST JSON 请求返回的成功 JSON 请求产生错误。

序列化器

class SimpleSerializer4(BulkSerializerMixin, ModelSerializer):

    user = serializers.SerializerMethodField()
    start_dt = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', input_formats=['%Y-%m-%d %H:%M:%S'])   

    def get_user(self, obj):
        test_me = self.context.get('request')
        return test_me


    class Meta(object):
        model = TransactionDateTime
        list_serializer_class = BulkListSerializer
        fields = ('pk','start_dt', 'user')

通过 GET 请求成功获取 JSON 数据

 [
  {
   "pk": 1,
   "start_dt": "2015-01-28 03:00:00",
   "user": "cdoe"
  },
  {
   "pk": 2,
   "start_dt": "2015-01-28 05:30:00",
   "user": "cdoe"
  }
 ]

视图和混合

class DateTimeMixin(object):
    serializer_class = SimpleSerializer4
    permission_classes = (permissions.IsAuthenticated,)


class DateTimeViewSet(DateTimeMixin, generics.BulkModelViewSet):

    def get_queryset(self):

        num = self.kwargs['dt_rm']
        num2 = self.kwargs['id']

        r1 = Room.objects.get(id = num)

        s1 = Schedule.objects.get(pk=num2)
        u= self.request.user.pk
        usr = User.objects.get(pk=u)

        if(s1.user.username == usr.username):
            queryset = r1.transactiondatetime_set.all()
            return queryset
        else: raise Http404("User does not exist")



    def get_serializer_context(self):

        num = self.kwargs['id']
        s1 = Schedule.objects.get(pk=num)
        var = s1.user.username
        context = super(DateTimeViewSet, self).get_serializer_context()
        return {'request' : var}

TransactionDateTime 模型

 class TransactionDateTime(models.Model):
    room = models.ForeignKey(Room, on_delete = models.CASCADE)
    start_dt = models.DateTimeField('start_dateTime')
    end_dt = models.DateTimeField('end_dateTime', blank=True, null=True)


    def __str__(self):
        return str(self.start_dt)

给我错误的 JSON POST 请求

[
  {
    "start_dt": "2015-01-28 03:00:00"

  },
  {
    "start_dt": "2015-01-28 02:00:00"

  }

]

【问题讨论】:

    标签: python json django serialization


    【解决方案1】:

    你可以试试这个

    即尽量不要覆盖 context 中的 request 键并返回整个上下文

    在日期时间视图集

    def get_serializer_context(self): 
        num = self.kwargs['id'] 
        s1 = Schedule.objects.get(pk=num) 
        var = s1.user.username 
        context = super(DateTimeViewSet, self).get_serializer_context() 
        context['user'] = var
        return context
    

    在SimpleSerializer4

    def get_user(self, obj): 
        test_me = self.context.get('user') 
        return test_me
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2015-06-16
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 2020-12-09
      相关资源
      最近更新 更多