gpt4 book ai didi

python - 具有多个嵌套对象的 Django Rest Framework 可写嵌套序列化程序

转载 作者:太空狗 更新时间:2023-10-30 01:37:37 25 4
gpt4 key购买 nike

我正在尝试创建一个可写的嵌套序列化程序。我的父模型是游戏,嵌套模型是测量。我正在尝试使用 AJAX 将此数据发布到我的 DRF 应用程序。但是,当尝试发布数据时,嵌套的 Measurements 为空 OrderedDict()。

这是我的模型:

class Game(models.Model):
start_timestamp = models.DateTimeField(auto_now_add=False)
end_timestamp = models.DateTimeField(auto_now_add=False)
date_added = models.DateTimeField(auto_now_add=True)


class Measurement(models.Model):
game = models.ForeignKey(Game, on_delete=models.PROTECT, related_name='measurements')
measurement_type = models.CharField(max_length=56)
measurement = models.CharField(max_length=56)
timestamp = models.DateTimeField(auto_now_add=False)
date_added = models.DateTimeField(auto_now_add=True)

这是我的序列化程序:

class MeasurementSerializer(serializers.ModelSerializer):
timestamp = serializers.DateTimeField(input_formats=(['%Y-%m-%d %H:%M:%S.%Z', 'iso-8601']), required=False)

class Meta:
model = Measurement
fields = ('measurement_type', 'measurement', 'timestamp')


class GameSerializer(serializers.ModelSerializer):
start_timestamp = serializers.DateTimeField(input_formats=(['%Y-%m-%d %H:%M:%S.%Z', 'iso-8601']))
end_timestamp = serializers.DateTimeField(input_formats=(['%Y-%m-%d %H:%M:%S.%Z', 'iso-8601']))
measurements = MeasurementSerializer(many=True)

class Meta:
model = Game
fields = ('id', 'start_timestamp', 'end_timestamp', 'measurements')

def create(self, validated_data):
measurements = validated_data.pop('measurements')
game = Game.objects.create(**validated_data)
for measurement in measurements:
Measurement.objects.create(game=game, **measurement)
return game

我对游戏的看法如下:

class GameList(generics.ListCreateAPIView):
queryset = Game.objects.all()
serializer_class = GameSerializer

我关注了this tutorial结构。

我正在尝试通过 AJAX 发布到此 API,代码如下:

 $.ajax({
url: base_url + '/games/',
dataType: "json",
data: {
"start_timestamp": "2016-02-16 14:51:43.000000",
"end_timestamp": "2016-02-16 14:53:43.000000",
"measurements":[
{'measurement_type':'type1', 'measurement':'71', 'timestamp':'2016-02-16 14:53:43.000000'},
{'measurement_type':'type1', 'measurement':'72', 'timestamp':'2016-02-16 14:54:43.000000'},
{'measurement_type':'type1', 'measurement':'73', 'timestamp':'2016-02-16 14:55:43.000000'},
]
},
type: 'POST'
})
.error(function(r){})
.success(function(data){})
});

在发布此数据时,我在 GameSerializer 的创建方法中发现 validate_data.pop('measurements') 包含 3 个空的有序字典 (OrderedDict()) 的列表。

更新:我发现通过 request.data 传入的 initial_data 的结构如下:

'emotion_measurements[0][measurement_type]' (4397175560) = {list} ['type1']
'emotion_measurements[0][measurement]' (4397285512) = {list} ['71']
'emotion_measurements[0][timestamp]' (4397285600) = {list} ['2016-02-16 14:53:43.000000']
'emotion_measurements[1][measurement_type]' (4397175040) = {list} ['type1']
'emotion_measurements[1][measurement]' (4397285864) = {list} ['72']
'emotion_measurements[1][timestamp]' (4397285952) = {list} ['2016-02-16 14:54:43.000000']
'emotion_measurements[2][measurement_type]' (4397175040) = {list} ['type1']
'emotion_measurements[2][measurement]' (4397285864) = {list} ['73']
'emotion_measurements[2][timestamp]' (4397285952) = {list} ['2016-02-16 14:55:43.000000']

有没有人遇到过这个问题?谢谢!

更新 #2

我能够通过将以下内容添加到我的 MeasurementSerializer 来解决这个问题(虽然我认为它更像是一种变通方法而不是解决方案):

def to_internal_value(self, data):
formatted_data = json.dumps(data)
formatted_data = formatted_data.replace("[", "").replace("]","")
formatted_data = json.loads(formatted_data)
return formatted_data

当我认为我需要一个字典时,传入的测量数据是一个查询字典。键和值周围还有一些额外的括号,所以我也必须删除它们。

仍在寻找比这更好的答案!

最佳答案

这里的问题出在前端。默认情况下,服务器将数据解释为 application/x-www-form-urlencoded 并且为了让它理解您正在向它发送 json,您需要指定$.ajax 请求中的 contentType:

$.ajax({
url: base_url + '/games/',
dataType: "json",
data: {...},
contentType: 'application/json; charset=UTF-8', // add this line
type: 'POST'
})
.error(function(r){})
.success(function(data){});

现在 GameSerializercreate() 方法中的 validated_data.pop('measurements') 应该使用 生成三个对象>measurements(但不要忘记从 Update#2 重做您的解决方法)。

关于python - 具有多个嵌套对象的 Django Rest Framework 可写嵌套序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35466300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com