我正在使用Django-nonrel和MongoDB。我的数据库数据在序列化程序上有问题。这是我的模型和序列化程序类
class info(models.Model):
price = DictField(EmbeddedModelField('data')
class data(models.Model):
field_vol = models.PositiveIntegerField()
我已经在Django shell中进行了测试,它可以将数据存储到数据库中(不是序列化的或反序列化的)。存储在数据库中的数据如下所示:
{
_id: blablabla,
price: {
'20121230': {
field_vol: 123
}
}
}
但是,当我尝试使用序列化程序恢复数据时,它会引发序列化程序中字段的问题。 这是我当前的序列化程序类:
class dataSerial(serializers.ModelSerializer):
class Meta:
model = data
class infoSerial(serializers.ModelSerializer):
data = dataSerial()
class Meta:
model = info
field = ('price')
由于价格包含外部字典和内部字典。错误提升与' field_vol'的搜索有关。价格但没有找到。请问我应该怎样做才能让序列化器在内部字典中搜索键和值?
**关键名称,即' 20121230'不是固定的密钥名称,它会根据输入日期而增加。
我设法在shell中获取序列化数据,这是结构:
infoSerial:
price = dataSerial():
field_vol = IntegerField()
但是,当我收到infoSerial.data时,它会因为搜索field_vol而失败,但是在此字段之前我有一个日期键。
我自己的另一个测试:我试图以这种方式修改价格字段:
price = DictField(DictField(EmbeddedModelField('data')))
这看起来比我之前的更合法,因为实际的存储包含嵌套的dict。但是,当我收到infoSerial时,错误就会消失:
AttributeError: 'float' object has no attribute 'pop'
我真的相信外部字典中的密钥名称不会通过此函数。我真的需要在dataSerial上做一个lambda,我该怎么办呢?
答案 0 :(得分:0)
使用序列化程序,Django REST框架需要类似于:
{
'price': {
'field_vol': 123
}
}
序列化程序不会将ID作为密钥。
您可以按如下方式更改mongoldb响应,并将id添加到字段中:
{
'price': {
'id': '20121230',
'field_vol': 123
}
}
答案 1 :(得分:0)
这个问题没有答案,因为在玩DictField时,当前的库不支持分配/定义每个键的值类型。 通过跳过在课堂上定义每个键的阶段,它完美地运行。在执行is_valid()时,验证永远不会为True。
希望DictField()有更新来定义字段。