"此字段是必填字段。"使用带Django REST Framework的POST发送JSON时

时间:2014-09-21 00:00:45

标签: django django-rest-framework

我有以下JSON我试图发布:

[
    {
        "action_alert_details": [], 
        "action_email": [
            {
                "tskmail_attach": null, 
                "tskmail_id": 4444, 
                "tskmail_memo": "TEST!", 
                "tskmail_priority": 1, 
                "tskmail_subject": "TEST!", 
                "tskmail_to_ext": "blah@blah.com", 
                "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')

1 个答案:

答案 0 :(得分:1)

发布此信息是因为其他人可能会遇到此问题,这似乎与传统数据库有关。问题在于“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个单独的dict文件并验证第一个,加载它然后验证第二个并加载它。

相关问题