Tastypie:REST API,其中POST和GET资源格式不同

时间:2013-04-30 17:49:30

标签: rest tastypie

我已经创建了一个API。获取我的资源给出了:

{
    category: {
        id: "517ed1bff929f90e1152ad43",
        name: "Test category"
    },
    cost: "Free",
    description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras tincidunt augue in mi scelerisque quis condimentum velit sollicitudin. Nam eleifend posuere semper. Pellentesque non nulla et arcu ornare lacinia. Donec quis dui at velit placerat volutpat vitae sit amet lorem. ",
    genders: [
        "M",
        "F"
    ],
    id: "517ed1bff929f90e1152ad44",
    tags: [
        {
            id: "517ed1bff929f90e1152ad3f",
            name: "testing",
            resource_uri: "/api/v1/interests/517ed1bff929f90e1152ad3f/"
        },
        {
            id: "517ed1bff929f90e1152ad41",
            name: "coding",
            resource_uri: "/api/v1/interests/517ed1bff929f90e1152ad41/"
        }
    ],
    location: {
        lat_lng: [
            51.500705,
            -0.124575
        ],
        locality: "London",
        name: "Big Ben"
    },
    resource_uri: "/api/v1/events/517ed1bff929f90e1152ad44/",
    slug: "test-event1",
    title: "Test event1"
}

我想允许用户将标签作为列表提交,例如['testing','coding','python']而不是要求他们提交对象 - 这是因为如果不存在标记对象,我将创建一个。

如何使用tastypie执行此操作,并且它违反了REST原则?

1 个答案:

答案 0 :(得分:0)

我做了类似的事情,除了我有GET和POST都使用名称而不是URI。这可能更加内部一致。

如果您只想让POST / PUT使用该名称,您应该能够定义hydrate_tags method of your resource。如果您阻止客户端使用URL而不允许使用名称,那么这样的事情可能会起作用:

def hydrate_tags(self, bundle):
    new_list = []
    for item in bundle:
        new_list.append(TagResource.build_bundle(data={name: item.data}))
    return new_list

请注意,上述内容未经验证 - 我没有检查hydrate_tags是否应返回列表或包。