Json 在Django中验证之前,如何从请求中的子对象获取信息?

Json 在Django中验证之前,如何从请求中的子对象获取信息?,json,django,serialization,django-rest-framework,Json,Django,Serialization,Django Rest Framework,我正在用Django编写一个api,使用。我有一个简单的模型如下: class PeopleCounter(models.Model): version = models.CharField(max_length=10) timestamp = models.DateTimeField(db_index=True) sensor = models.CharField(max_length=10) count = models.IntegerField() cla

我正在用Django编写一个api,使用。我有一个简单的模型如下:

class PeopleCounter(models.Model):
    version = models.CharField(max_length=10)
    timestamp = models.DateTimeField(db_index=True)
    sensor = models.CharField(max_length=10)
    count = models.IntegerField()
class PeopleCounterSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = PeopleCounter
        fields = [
            'version',
            'timestamp',
            'sensor',
            'count',
        ]
{
    "version": "v1",
    "timestamp": "2019-04-01T20:00:00.312",
    "data": {
        "sensor": "sensorA",
        "count": 4
    }
}
我有一个序列化程序,如下所示:

class PeopleCounter(models.Model):
    version = models.CharField(max_length=10)
    timestamp = models.DateTimeField(db_index=True)
    sensor = models.CharField(max_length=10)
    count = models.IntegerField()
class PeopleCounterSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = PeopleCounter
        fields = [
            'version',
            'timestamp',
            'sensor',
            'count',
        ]
{
    "version": "v1",
    "timestamp": "2019-04-01T20:00:00.312",
    "data": {
        "sensor": "sensorA",
        "count": 4
    }
}
当我将以下数据发布到此端点时,效果非常好:

{
    "version": "v1",
    "timestamp": "2019-04-01T20:00:00.312",
    "sensor": "sensorA",
    "count": 4
}
但不幸的是,我需要调整数据到达的端点,如下所示:

class PeopleCounter(models.Model):
    version = models.CharField(max_length=10)
    timestamp = models.DateTimeField(db_index=True)
    sensor = models.CharField(max_length=10)
    count = models.IntegerField()
class PeopleCounterSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = PeopleCounter
        fields = [
            'version',
            'timestamp',
            'sensor',
            'count',
        ]
{
    "version": "v1",
    "timestamp": "2019-04-01T20:00:00.312",
    "data": {
        "sensor": "sensorA",
        "count": 4
    }
}
我想我需要向序列化程序类添加一个create方法。所以我试过了,但是当我用
“data”
对象发布json时,我得到一条消息,即传感器字段和计数字段是必需的

有人知道我在哪里可以规范化这些数据,以便我可以将其正确插入数据库吗

另外,如果我也希望通过相同的端点为数据提供服务,那么在哪里可以定义它呢


欢迎所有提示

一种可能的方法是在视图级别实现它。如果您使用的是CBV override
get_serializer
类似以下内容:

def get_serializer(self, *args, **kwargs):
    request_body = kwargs.get("data")  # obtain request body
    data = request_body.get("data")  # get data
    request_body.update(data)  # add data as request_body attributes
    kwargs["data"] = request_body  # override received request_body with updated one

    serializer_class = self.get_serializer_class()
    kwargs['context'] = self.get_serializer_context()
    return serializer_class(*args, **kwargs)

一种可能的方法是在视图级别实现它。如果您使用的是CBV override
get_serializer
类似以下内容:

def get_serializer(self, *args, **kwargs):
    request_body = kwargs.get("data")  # obtain request body
    data = request_body.get("data")  # get data
    request_body.update(data)  # add data as request_body attributes
    kwargs["data"] = request_body  # override received request_body with updated one

    serializer_class = self.get_serializer_class()
    kwargs['context'] = self.get_serializer_context()
    return serializer_class(*args, **kwargs)

由于我是Django初学者,我花了一些时间才理解CBV的意思是“基于类的视图”,我必须把它放在哪里,但我成功了,现在它工作得很好!还有一件事;你知道我如何使用相同的结构在api上再次提供这种服务吗(因此在
“data”
“data”)中使用
sensor
count
)?@kramer65如果你需要将这种逻辑扩展到多个视图,你可以尝试在自定义解析器中实现:@kramer65添加自定义中间件是另一种选择,因为我是Django初学者,我花了一些时间才明白CBV的意思是“基于类的视图”,我必须把它放在哪里,但我成功了,现在它工作得很好!还有一件事;你知道我如何使用相同的结构在api上再次提供此服务吗(因此,使用
传感器
计数
“数据”)?@kramer65如果需要将此逻辑扩展到多个视图,可以尝试在自定义解析器中执行此操作:@kramer65添加自定义中间件是我提供的另一个选项