在MongoDB中使用嵌套DictField的Django REST框架

时间:2015-11-04 01:53:49

标签: django mongodb serialization django-rest-framework

我正在使用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,我该怎么办呢?

2 个答案:

答案 0 :(得分:0)

使用序列化程序,Django REST框架需要类似于:

{
    'price': {
        'field_vol': 123
    }
}

序列化程序不会将ID作为密钥。

您可以按如下方式更改mongoldb响应,并将id添加到字段中:

{
    'price': {
        'id': '20121230',
        'field_vol': 123
    }
}

答案 1 :(得分:0)

这个问题没有答案,因为在玩DictField时,当前的库不支持分配/定义每个键的值类型。 通过跳过在课堂上定义每个键的阶段,它完美地运行。在执行is_valid()时,验证永远不会为True。

希望DictField()有更新来定义字段。