2015-11-04 76 views
0

我在MongoDB中使用Django-nonrel。我的序列化程序与我的数据库数据有关。这里有在MongoDB中嵌套DictField的Django REST框架

class info(models.Model): 
    price = DictField(EmbeddedModelField('data') 

class data(models.Model): 
    field_vol = models.PositiveIntegerField() 

我已经在Django壳测试我的模型和串类,并与将数据存储到数据库中(不序列化或反序列化)的作品。存储在数据库中的数据显示为这样:

{ 
    _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'不是固定密钥名称,它根据输入日期而增加。

我设法在外壳序列化的数据,这里是结构:

infoSerial: 
    price = dataSerial(): 
    field_vol = IntegerField() 

然而,当我得到的infoSerial.data,它,因为它正在搜索field_vol但是我有个约会失败在此字段之前键入。

另一个测试自己:我曾尝试到价格字段修改成这样子:

price = DictField(DictField(EmbeddedModelField('data'))) 

这看起来比我以前的一个更合法的,因为实际的存储包含嵌套的字典。但是,错误脱落时,我收到infoSerial:

AttributeError: 'float' object has no attribute 'pop' 

我真的相信,在外部字典的键名不通过这个功能。我真的需要在dataSerial上做一个lambda表达式,我该怎么做?

回答

0

有了您的串行Django的REST框架也希望有类似的东西:

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

串行器不会采取一个ID为关键。

你可能可以改变mongoldb响应如下和ID添加到域:

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

感谢您的建议,但是,因为我有多个价格数据要存储到数据库中,所以设置id字段对我来说不会有用。 我已经想过使用List存储Dict项目,但是当我需要获取特定日期的数据时它并不高效。 – DrKNa

+0

我并不是建议你改变存储格式。但是,您可以在data/validated_data和mongodb之间编写一些粘合代码来填补空白。 – Linovia

+0

我目前正在研究.to_representation()函数,看看我是否可以对零件进行一些重写。但是,我想知道是否有其他方式根据返回的数据获取键和值。 – DrKNa

0

的问题没有答案,这是因为与DictField玩的时候,当前的库不支持分配/定义每个键的值类型。 通过跳过阶级定义每个关键的阶段,它完美的作品。执行is_valid()时,验证从不为真。

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