Django类基本视图可以处理REST API吗?

时间:2014-11-27 23:50:24

标签: django rest

我正在使用Django通用视图。出于某些原因,我不允许使用其他Rest Framework(例如Tastypie)来处理rest API。

我想看看我是否可以使用可以处理CRUD http方法的通用视图。

有人能指点我一个例子吗?

到目前为止,我的网址是这样的:

url(r'^user/$', views.UserView.as_view(), name='user'),

我不确定一个url如何处理所有CRUD方法。

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个如何完成它的例子,它实际上取决于你的要求,因为你没有提供任何我只会谈论我的用例而不是EXTJS。

这是url.py,动作是' c'用于创造和' d'删除。 objtype是模型的名称,app是可以找到模型的应用程序(您可能不需要)。

    url(r'^model_json/(?P<action>[a-z]+)/(?P<objtype>[A-Za-z0-9-_]+)', 'jsonhelper.views.flatdata_cud', {'ext':True,'app':rhinomodels }, name = 'model_cud_json'),

来自EXTjs的URL会将此视为创建新用户。因此,用户详细信息将作为json数据发布,该数据在HTTP POST中可用。         127.0.0.1:8000/model_json/c/User

这是我的代码。 get_fk_model是一个内部函数,它将返回fk对象的关联模型,如果它不是fk类型,则返回None。

import json

@login_required
@csrf_exempt
def flatdata_cud(request, objtype, action, id = None, idfield = None, follow_related = False, app = None):
    """     Implements the Create Update and Delete functions for ExtJS data store porxy's  """

    djmodel = getattr(app, objtype)
    if not djmodel:
        return errorMsg("Model not found, %s"%(objtype))

    if request.method != 'POST':
        return errorMsg("Must be a post action, %s"%(request.method))

    data = json.loads(request.body)
    if type(data) == dict:
        data = [data,]
    kwargs =  {}
    id_list = []

    def check_value(data):
        for k in data:          
            fkmodel = get_fk_model(djmodel, k) 
            if fkmodel: # we have a ForeignKey, change value to be an object of this type
                data[k] = fkmodel.objects.get(id = data[k] )
        return data

    for d in data:
        d = check_value(d)
        id = None
        if action == 'c':
            rec = djmodel()
            if d.has_key('id'): d.pop('id')
        else:           
            id = d.pop('id')
            rec = djmodel.objects.get(id = id)
        if action == 'd':
            rec.delete()
        else:       
            for i in d.keys():
                setattr(rec, i, d[i])
            rec.save()
        id_list.append( id if id else rec.id )      
    kwargs['id__in'] = id_list

    return flatdata(request, objtype, id = id, idfield = idfield, follow_related = follow_related, add_filter = kwargs, app = app)

作为最后一步,我返回flatdata,返回EXTjs一个新的json对象,了解对象在更新后的样子。