2015-11-04 74 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()有一個更新來定義字段。