2014-09-21 49 views
0

我有以下的JSON我試圖張貼:「此字段是必填字段。」使用POST Django的REST框架發送JSON時

[ 
    { 
     "action_alert_details": [], 
     "action_email": [ 
      { 
       "tskmail_attach": null, 
       "tskmail_id": 4444, 
       "tskmail_memo": "TEST!", 
       "tskmail_priority": 1, 
       "tskmail_subject": "TEST!", 
       "tskmail_to_ext": "[email protected]", 
       "tskmail_to_int": null 
      } 
     ], 
     "action_job_details": [], 
     "action_log_details": [], 
     "action_snmp_details": [], 
     "action_variable_details": [], 
     "nodmst_name": null, 
     "owner_name": "Operations     ", 
     "servicemst_name": null, 
     "tskmst_desc": null, 
     "tskmst_id": 4444, 
     "tskmst_lstchgtm": "2014-09-17T16:02:29", 
     "tskmst_name": "act_test      ", 
     "tskmst_public": "Y", 
     "tskmst_type": 1 
    } 
] 

當通過以下幾種觀點發送它,它的抱怨:

[ 
    { 
     "action_email": [ 
      { 
       "tskmail_id": "This field is required." 
      } 
     ] 
    } 
] 

但作爲你可以在我的頂部看到JSON,它就在那裏。那麼,爲什麼我的觀點在序列化過程中似乎沒有認識到它存在?

def put(self, request, format=None): 

    data = request.DATA 
    owner = data[0]['owner_name'] 
    ownerid = Owner.objects.filter(owner_name=owner).values_list('owner_id', flat=True)[0] 
    data[0].update({'owner_id': ownerid}) 
    actid = data[0]['tskmst_id'] 
    actname = data[0]['tskmst_name'] 
    if data[0]['nodmst_name'] == None: 
     data[0].update({'nodmst_id': None}) 
    else: 
     nodname = data[0]['nodmst_name'] 
     nodid = Nodmst.objects.filter(nodmst_name=nodname).values_list('nodmst_id', flat=True)[0] 
     data[0].update({'nodmst_id': nodid}) 
    if data[0]['servicemst_name'] == None: 
     data[0].update({'servicemst_id': None}) 
    else: 
     servicename = data[0]['servicemst_name'] 
     serviceid = Servicemst.objects.filter(servicemst_name=servicename).values_list('servicemst_id', flat=True)[0] 
     data[0].update({'servicemst_id': serviceid}) 
    if Tskmst.objects.filter(tskmst_name=actname).exists(): 
     data[0]['tskmst_id'] = Tskmst.objects.filter(tskmst_name=actname).values_list('tskmst_id', flat=True)[0] 
     data[0]['action_email'][0]['tskmail_id'] = Tskmst.objects.filter(tskmst_name=actname).values_list('tskmst_id', flat=True)[0] 
    else: 
     maxtskid = Tskmst.objects.latest('tskmst_id').tskmst_id 
     data[0]['tskmst_id'] = maxtskid + 1 
     data[0]['action_email'][0]['tskmail_id'] = maxtskid + 1 
     Tblcnt.objects.filter(tblcnt_tblname='tskmst').update(tblcnt_lstid=(maxtskid +1)) 
     Tblcnt.objects.filter(tblcnt_tblname='tskmail').update(tblcnt_lstid=(maxtskid +1)) 
    serializer = self.get_serializer_class()(data=request.DATA, many=True) 
    if serializer.is_valid(): 
#   serializer.save() 
     return Response(serializer.data, status=status.HTTP_201_CREATED) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

這裏是我的串行被一起拉出數據:

class ActionMailSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Tskmail 
     resource_name = 'tskmail' 

class ActionPUTSerializer(serializers.ModelSerializer): 
    owner_id = serializers.Field(source='owner_id') 
    action_email = ActionMailSerializer() 

    class Meta: 
     model = Tskmst 
     resource_name = 'tskmst' 
     depth = 1 
     fields = ('tskmst_id', 'tskmst_name', 'tskmst_desc', 'tskmst_type', 'owner_id', 'tskmst_public', 
       'tskmst_lstchgtm', 'nodmst_id', 'servicemst_id', 'action_email', 'action_alert_details', 
       'action_snmp_details', 'action_job_details', 'action_log_details', 'action_variable_details') 
+0

很難說出了什麼問題。嘗試記錄'tskmail_id'的輸出。在'data = request.DATA'之後放置'print data [0] ['action_email'] [0] ['tskmail_id']'並在控制檯中查看輸出。也許在你操縱這個值的if/else塊中嘗試一樣,看看會發生什麼。 – cezar 2014-09-22 07:29:06

回答

1

張貼這對於其他人可能會遇到這個問題,這似乎是關於它是一個傳統的DB的潛力。問題在於,「tskmail」表中的PK字段也是「tskmst」的FK。

有關更多信息,請參閱Multi-Column Primary Key support

我最終做的是制定另一套模型嚴格的PUT,沒有FK關係,但嚴格來說是一個整數字段。

class TskmailPOST(models.Model): 
    tskmail_id = models.IntegerField(primary_key=True) 
    tskmail_to_int = models.TextField(blank=True) 
    tskmail_to_ext = models.TextField(blank=True) 
    tskmail_subject = models.TextField(blank=True) 
    tskmail_memo = models.TextField(blank=True) # This field type is a guess. 
    tskmail_priority = models.SmallIntegerField(blank=True, null=True) 
    tskmail_attach = models.TextField(blank=True) 
    class Meta: 
     managed = False 
     db_table = 'tskmail' 

代替 -

class TskmailPOST(models.Model): 
    tskmail_id = models.ForeignKey(Tskmst, db_column='tskmail_id', primary_key=True) 
    tskmail_to_int = models.TextField(blank=True) 
    tskmail_to_ext = models.TextField(blank=True) 
    tskmail_subject = models.TextField(blank=True) 
    tskmail_memo = models.TextField(blank=True) # This field type is a guess. 
    tskmail_priority = models.SmallIntegerField(blank=True, null=True) 
    tskmail_attach = models.TextField(blank=True) 
    class Meta: 
     managed = False 
     db_table = 'tskmail' 

然後我不得不打電話2個獨立的串行器和使用POST數據,分解成2個獨立的字典文件和驗證所述第一,加載然後它驗證該第二和加載它。

相關問題