在django rest框架api中通过请求标题发布device_id

问题描述:

我想通过下面的请求标题发布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()), 

序列化程序需要数据字典。将串行器实例化更改为:

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

感谢这是准确的 –

+0

你能告诉我如何将这个设备id包含在我的request.data中并将它传入串行器。这是代码device_id = request.META.get('HTTP_DEVICE','') serializer = UserSerializer(data = request.data) –

+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

我正在使用有效的整数。我试图通过传递没有值来测试它,它仍然显示相同的错误。我的代码和上面一样,我做了一些修改,比如传递一个字典 –