【问题标题】:Django Rest Framework get key from serializer.dataDjango Rest Framework 从 serializer.data 获取密钥
【发布时间】:2016-06-23 11:41:03
【问题描述】:

好的,所以我的问题很简单,在调用 def create() 之后:它返回了多个字典,所以我想从这个字典中获取一个键。

这是我的看法:

def create(self, request, *args, **kwargs):
    #data = json.dumps(request.data)
    user = self.request.user
    if user.groups.filter(name='advertisers').exists():
        serializer = CampaignSerializer(data=request.data)
        adsImageSerializer = AdsImagesSerializer()
        if serializer.is_valid():
            serializer.save(advertiser=self.request.user)
            raise Exception(serializer.validated_data['id'])
            return Response(serializer.data, status=status.HTTP_201_CREATED,)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response({
                            'status':'Unauthorized',
                            'message':'This account is not authorized to do this request'
                    }, status=status.HTTP_401_UNAUTHORIZED)
    return super(CampaignStart, self).perform_create(serializer)

如您所见,我试图通过

中的断点来访问它

引发异常(serializer.validated_data['id'])

当我打印时:

引发异常(serializer.data)

它返回给我:

{'advertiser': OrderedDict([('username', u'demo'), ('first_name', u'genti'), ('last_name', u'elmazi'), ('email', u 'demo@demo.com'), ('password', u'pbkdf2_sha256$24000$VuPC2uIB4Lb1$Rc9++gdVbAtnNgsD9XxzUx8vlVIaIxztfjNKRY0FOwM='), ('advertiser', OrderedDict([('phone', u'+389716666022'), 'address', u'balindollska bb'), ('state', u'macedonia'), ('city', u'gostivar'), ('ZIP', u'1230'), ('country', u 'MK'), ('company', u'maxleads'), ('web_name', u'maxleads'), ('web_url', u'http://www.test.com'), ('web_desc', u'demo description' ), ('web_category', u'Automotive'), ('online_revenue', 546546), ('meth_of_conv', u'pay-per-sale')]))]), 'name': u'Demo Campaign' , 'end_date': '2016-06-23', 'pay_off': 30, 'description': u'demo description', 'CPC': 2, 'locations': u'Macedonia', 'budget': 10, 'commission': 10, 'keywords': u'keyword 1, keyword 2', 'ads': [OrderedDict([('id', 26), ('headline', u'Demo Headline'), ('description_1 ', u''), ('description_2', u''), ('display_url', u''), ('final_url', u''), ('mobile_url ', u''), ('advertiser', 1)])], 'adsImages': [], 'type': u'PayPerSale', 'start_date': '2016-06-23', 'land_page': u'http://www.test.com', 'CPM': 1}

我想访问这个:

ads': [OrderedDict([('id', 26),

我该怎么做?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    “id”键在“abs”字典中,因此您需要先访问“abs”。然后访问“id”键。

    试试这个:

    def create(self, request, *args, **kwargs):
        #data = json.dumps(request.data)
        user = self.request.user
        if user.groups.filter(name='advertisers').exists():
            serializer = CampaignSerializer(data=request.data)
            adsImageSerializer = AdsImagesSerializer()
            if serializer.is_valid():
                serializer.save(advertiser=self.request.user)
                raise Exception(serializer.validated_data['abs']['id'])
                return Response(serializer.data, status=status.HTTP_201_CREATED,)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response({
                                'status':'Unauthorized',
                                'message':'This account is not authorized to do this request'
                        }, status=status.HTTP_401_UNAUTHORIZED)
        return super(CampaignStart, self).perform_create(serializer)
    

    【讨论】:

    • 为什么它告诉我:TypeError: list indices must be integers, not str
    • 这是因为您的 dic 在列表中。您必须在访问 de dict 之前访问列表的 de 索引。
    • 如果您的列表始终只有一项(“广告商”),您可以像这样访问:serializer.validated_data[0]['abs']['id']
    • 它给了我一个 KeyErros,可能是因为这是一个 OrderedDict
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 1970-01-01
    • 2016-07-08
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2022-12-05
    相关资源
    最近更新 更多