如何在Flask Eve中插入包含dicts和list的记录?

2024-06-25 22:58:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用flaskeve为我的数据提供一个API。我想用Eve插入我的记录,这样我就得到了一个由Eve创建的属性和另一个Eve添加的属性。在

我的两个字段是dicts,一个是list。当我试图把它插入到Eve中时,结构似乎变平了,丢失了一些信息。试图告诉Eve dict&list元素会给我一个POST错误,说那些字段必须是dict和list,但它们已经是了!有人能帮我说说我做错了什么吗?在

我的Eve配置是这样的:

'myendpoint': { 'allow_unknown': True,
                   'schema': { 'JobTitle': { 'type':       'string',
                                             'required':       True,
                                             'empty':         False,
                                             'minlength':         3,
                                             'maxlength':        99 },
                                'JobDescription': { 'type': 'string',
                                                    'required':       True,
                                                    'empty':         False,
                                                    'minlength':        32,
                                                    'maxlength':        102400 },
                           },
               },

但当我使用请求发布以下结构时:

^{pr2}$

post行如下所示:

resp = requests.post(url, data = job)

它会变得“扁平化”,并丢失来自dicts和list的信息:

{
        "_id" : ObjectId("56e83f5a6dbf9a6395ea559d"),
        "Salary" : "OtherPay",
        "_updated" : ISODate("2016-03-15T16:59:06Z"),
        "ContactPhone" : "xx",
        "JobTypeCodeList" : "Public Sector",
        "CompanyName" : "Scc",
        "url" : "xxx",
        "JobTitle" : "xx",
        "WebAdID" : "TA7494725_1_1",
        "JobDescription" : "xxx",
        "JobLocation" : "DisplayCity",
        "CustomField1" : "Permanent",
        "_created" : ISODate("2016-03-15T16:59:06Z"),
        "CustomField3" : "FTJOBUKNCSG",
        "_etag" : "55d8d394141652f5dc2892a900aa450403a63d10",
        "JobType" : "Full",
        "ProductID" : "JCPRI0UK"
}

我试着更新我的模式,说有些是dicts和list:

     'JobTypeCodeList': { 'type': 'list'},
     'Salary':          { 'type': 'dict'},
     'JobLocation':     { 'type': 'dict'},

但当我在新唱片上贴出一个错误

 {u'Salary': u'must be of dict type', u'JobTypeCodeList': u'must be of list type', u'JobLocation': u'must be of dict type'},

我在发帖之前已经证实了type(job.Salary) == dict等等,所以我不确定如何解决这个问题。虽然我可以绕过Eve直接将记录发布到MongoDB ok中,但如果可能的话,我更喜欢使用Eve。在


Tags: oftrue属性type记录beeve结构
1条回答
网友
1楼 · 发布于 2024-06-25 22:58:40

如果这对其他人有用,我最终解决了这个问题,在Eve中发布了一个平面结构,然后使用on_insert和on_update事件循环遍历键并从中构造对象(和列表)。在

它有点复杂,但它能做到这一点,现在它已经就位,使用起来相当透明。我通过Eve添加到MongoDB的对象现在有了嵌入的列表和散列,但是它们也获得了方便的Eve属性,比如_created和_updated,而POST和PATCH请求也通过Eve的正常模式进行验证。在

唯一令人尴尬的是on_insert和on_update发送的参数略有不同,因此在下面的代码中有很多重复,我还没有对其进行重构。在

任何字符都可以用作标志:我使用两个下划线来表示应该作为单个对象结束的键/值,使用两个和号表示应该拆分为一个列表的值。我现在发布的结构如下:

    "Salary__OtherPay" : "On Application"
    "ContactPhone" : "xx",
    "JobTypeCodeList" : "Public Sector&&Other",
    "CompanyName" : "Scc",
    "url" : "xx",
    "JobTitle" : "xxx",
    "WebAdID" : "TA7494725_1_1",
    "JobDescription" : "xxxx",
    "JobLocation__DisplayCity" : "BRIDGWATER",
    "JobLocation__City" : "BRIDGWATER",
    "JobLocation__StateProvince" : "Somerset",
    "JobLocation__Country" : "UK",
    "JobLocation__PostalCode" : "TA6"
    "CustomField1" : "Permanent",
    "CustomField3" : "FTJOBUKNCSG",
    "WebAdManagerEmail" : "xxxx",
    "JobType" : "Full",
    "ProductID" : "JCPRI0UK"

我的Eve模式也相应地进行了更新,以验证这些新键名的值。然后在后端,我定义了下面的函数,该函数检查传入的键/值并将其转换为对象/列表,同时删除原始的和&;数据:

^{pr2}$

然后我告诉Eve在插入和更新该集合时运行该函数:

app.on_insert_myendpoint += flat_to_complex
app.on_update_myendpoint += flat_to_complex

这就实现了我所需要的,并且Mongo中的结果记录与上面问题中的记录相同(具有\u created和\u updated属性)。这显然不太理想,但它已经达到了,而且一旦安装到位,使用起来相当容易。在

相关问题 更多 >