【问题标题】:Django REST framework with nested DictField in MongoDB在 MongoDB 中具有嵌套 DictField 的 Django REST 框架
【发布时间】:2015-11-04 01:53:48
【问题描述】:

我在 MongoDB 中使用 Django-nonrel。我的数据库数据在序列化程序上有问题。这是我的模型和序列化程序类

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”的 serach 有关,但没有找到。请问我应该如何让序列化程序在内部字典中搜索键和值?

** 键名,即'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,请问我应该怎么做?

【问题讨论】:

    标签: django mongodb serialization django-rest-framework


    【解决方案1】:

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

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

    序列化程序不会将 ID 作为键。

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

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

    【讨论】:

    • 感谢您的建议,但是,由于我有多个价格数据要存储到数据库中,因此设置 id 字段对我没有用处。我曾考虑使用 List 存储 Dict 项目,但是当我需要获取特定日期的数据时效率不高。
    • 我并不是建议您更改存储格式。但是,你可以在 data/validated_data 和 mongodb 之间写一些胶水代码来填补空白。
    • 我目前正在研究 .to_representation() 函数,看看我是否可以对部件进行一些重写。但是,我想知道是否有其他方法可以根据返回的数据获取键和值。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 1970-01-01
      • 2016-08-06
      • 2020-11-07
      • 1970-01-01
      • 2014-05-21
      • 2013-06-17
      • 2021-06-23
      • 2014-09-18
      相关资源
      最近更新 更多