gpt4 book ai didi

eve - 如何实现嵌入对象的可附加列表

转载 作者:行者123 更新时间:2023-12-04 20:32:47 24 4
gpt4 key购买 nike

我正在尝试使用 Eve 为简单的项目列表提供 RESTful API。

我想使用 1)一个 HTTP 请求来创建一个列表(可能带有初始项目),2)一个 HTTP 请求来添加一个项目(一个常见操作),3)一个 HTTP 请求来获取列表(包括所有子项)。换句话说:

1) POST /lists有 body

{
"title": "My List",
"items": [{
"name": "Alice"
},
{
"name": "Bob"
}]
}

2) POST /lists/555555555555555555555555/items有 body
{
"name": "Carol"
}

3) GET /lists/555555555555555555555555
{
"_id": "555555555555555555555555",
"title": "My List",
"items": [{
"_id": "aaaaaaaaaaaaaaaaaaaaaaaa",
"name": "Alice"
},
{
"_id": "bbbbbbbbbbbbbbbbbbbbbbbb",
"name": "Bob"
},
{
"_id": "cccccccccccccccccccccccc",
"name": "Carol"
}]
}

我还没有想出如何对 Eve 做到这一点。我可以(1)使用嵌入的字典列表,但我不能这样做(2) - 我必须发布一个项目,然后修补列表( ? )。我可以使用子资源做(2),但我不能做(1)( "value '{'name': 'Alice'}' cannot be converted to a ObjectId")。还是我错过了什么?

如果这三个都不能完成,那么至少(2)和(3)都可以吗?

最佳答案

我想出了如何实现(2)和(3),使用数据库事件 Hook 将嵌入的子文档注入(inject)到父列表中,然后再返回给客户端(并在删除父级时删除子级)。这有效并支持单个列表项的预期 REST 使用。但是,它会导致两个数据库查询。

我怀疑(1)也可以使用事件 Hook 来实现,但现在就足够了。

欢迎任何进一步的改进/建议。如果有更简单的方法来实现这一点,那就太好了(关键字:One-to-Many Relationships with Embedded Documents)。

设置.py:

RESOURCE_METHODS = ['GET', 'POST', 'DELETE']
ITEM_METHODS = ['GET', 'PUT', 'PATCH', 'DELETE']

lists = {
'schema': {
'title': {
'type': 'string'
}
}
}

items = {
'url': 'lists/<regex("[a-f0-9]{24}"):list_id>/items',
'schema': {
'name': {'type': 'string',
'required': True
},
'list_id': {
'type': 'objectid',
'required': True,
'data_relation': {
'resource': 'lists',
'field': '_id'
}
}
}
}

DOMAIN = {
'lists': lists,
'items': items
}

主要.py:
from bson.objectid import ObjectId

def before_returning_lists(response):
list_id = response['_id']
response['items'] = list(db.items.find({'list_id': ObjectId(list_id)}))

def after_deleting_lists(item):
list_id = item['_id']
db.items.delete_many({'list_id': ObjectId(list_id)})

app.on_fetched_item_lists += after_fetching_lists
app.on_deleted_item_lists += after_deleting_lists

用法
curl -X POST http://127.0.0.1:5000/lists -d title="My List"

# (2)
curl -X POST http://127.0.0.1:5000/lists/5895fdb5a663e2dcad9e7647/items -d 'name=Alice'
curl -X POST http://127.0.0.1:5000/lists/5895fdb5a663e2dcad9e7647/items -d 'name=Bob'
curl -X POST http://127.0.0.1:5000/lists/5895fdb5a663e2dcad9e7647/items -d 'name=Carol'

# (3)
curl -X GET http://127.0.0.1:5000/lists/5895fdb5a663e2dcad9e7647

关于eve - 如何实现嵌入对象的可附加列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41895442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com