2017-07-31 114 views
-1

我想通過下面的請求標題發佈device_id是我的代碼,但我無法發佈它。我通過postman中的標題發送device_id。在django rest框架api中通過請求標題發佈device_id

PLZ避免的間距

views.py

class DeviceID(APIView): 
def post(self, request): 
    device_id = request.META.get('HTTP_X_DEVICE', '') 
    serializer = DeviceSerializer(data=device_id) 
    if serializer.is_valid(): 
     serializer.save() 
    else: 
     return Response(serializer.errors) 

serializers.py

class DeviceSerializer(serializers.ModelSerializer): 
DEVICE = serializers.IntegerField() 

class Meta: 
    model = Device 
    fields = 'DEVICE' 

def create(self, validated_data): 
    return Device.objects.create(**validated_data) 

models.py

class Device(models.Model): 
    DEVICE = models.IntegerField() 

urls.py

url(r'^device/', views.DeviceID.as_view()), 

回答

0

序列化程序需要數據字典。將串行器實例化更改爲:

serializer = DeviceSerializer(data={'DEVICE': device_id}) 
+0

感謝這是準確的 –

+0

你能告訴我如何將這個設備id包含在我的request.data中並將它傳入串行器。這是代碼device_id = request.META.get('HTTP_DEVICE','') serializer = UserSerializer(data = request.data) –

+0

感謝您的幫助 –

0

串行器'字段'應該是一個列表。現在序列化器正在期待字段('D','E','V','I','C','E') - 所以序列化器忽略它接收到的DEVICE值。相反,('DEVICE',)

序列化程序中傳遞的數據必須是字典。

你在郵遞員中使用什麼標題名稱? Django在所有頭文件中加上了HTTP_前綴 - 甚至已經以HTTP_開頭的文件頭__

您不需要將DEVICE字段顯式定義爲serialzer上的IntegerField。 ModelSerializers從模式推斷字段類型。

您不需要在ModelSerializer上指定'create'。它已經爲你處理了。

而不是做return Response(errors),你可以做serialzer.is_valid(raise_exception=True)和框架將自動返回400串行器錯誤的響應代碼。

以$結束URL模式,否則會出現不需要的副作用,例如/ device/ghhffffghghnfrrdxc路由到您的視圖,而不是404。

+0

我改變了我的代碼,現在我在我的'HTTP_X_HEADER_DEVICE'代碼和郵遞員在標題中,但它給這個錯誤{ 「設備」:[ 「有效的整數是必需的。」 ] } –

+0

您使用什麼值稱爲「HEADER_DEVICE」頭?我認爲這是一個有效的整數? – rikAtee

+0

我正在使用有效的整數。我試圖通過傳遞沒有值來測試它,它仍然顯示相同的錯誤。我的代碼和上面一樣,我做了一些修改,比如傳遞一個字典 –