将Django应用程序转换为DRF应用程序

将Django应用程序转换为DRF应用程序,django,Django,我有一个django应用程序还没有上线,我刚收到一个使用API的请求,最后我选择了DRF。但我对它的一些组成部分真的很迷茫。我可以登录,获取令牌并传递令牌以获取一些东西。现在,它将在前端使用angular.as,这需要全部是JSON 虽然我将重写视图,但我希望尽可能多地重用,尤其是模块。例如,我有一个验证来验证表格的注册(它从三个不同的角度使用,因为会员可以通过三种不同的方式注册,并应用一些条件,即自我注册、公司注册和公司代理注册) forms.py清理方法示例: class NewMemb

我有一个django应用程序还没有上线,我刚收到一个使用API的请求,最后我选择了DRF。但我对它的一些组成部分真的很迷茫。我可以登录,获取令牌并传递令牌以获取一些东西。现在,它将在前端使用angular.as,这需要全部是JSON

虽然我将重写视图,但我希望尽可能多地重用,尤其是模块。例如,我有一个验证来验证表格的注册(它从三个不同的角度使用,因为会员可以通过三种不同的方式注册,并应用一些条件,即自我注册、公司注册和公司代理注册)

forms.py清理方法示例:

  class NewMemberForm(forms.Form):
  firstName=forms.CharField(max_length=25,required=True,widget=forms.TextInput())

def clean(self):

    self.cleaned_data=super(NewMemberForm,self).clean()

    validate_member_form=validate_member(self.cleaned_data,directregistration=True)

    #do we have error messages now?

    if len(validate_member_form[0])>0: #yes we have error messages
        raise forms.ValidationError(_(validate_member_form[0]),code='invalid')

    return validate_member_form[1]
和my views.py:

    if request.method=='POST':

    err_found=False
    go_id=''

    form=NewMemberForm(request.POST or None)

    if form.is_valid():
     #create user
     pass

我看到forms.py在drfapiview中是无用的(至少我没有得到一个示例)。如何转换这样一个应用程序而不费吹灰之力呢?

问题是——你不能(至少不容易)。DRF程序员已经决定实现
序列化程序
,作为与
django表单
完全不同的并行结构。事实上,他们甚至不分享任何故事。当然,您可以使用mixin在表单和序列化程序中共享代码,但是还有一些细微的差别,比如
表单
清除
方法,而序列化程序有
验证
方法

下面是一些可以用来最小化代码重复的策略-

  • 瘦视图和胖模型-尝试将大部分业务逻辑保留在模型中(如果它们与模型相关),或单独的域类中。视图应该只是模型和模板之间的连接,不应该包含业务或与模型相关的逻辑。这样,您编写的代码可以在django的普通视图和DRF视图中重用。如果您想进一步了解这一点,请尝试在模型级别封装全局验证和约束(即始终为true的验证),然后您可以编写某些序列化程序混合,以捕获模型中的验证错误并将其显示给用户

  • 面向服务的体系结构-尝试将所有内容编写为服务或REST API,并在正常视图中使用这些服务。我的公司有一些性能问题,所以我最终编写了一个定制的请求客户机(在django测试客户机的线路上),它实际上并不向api发出http请求,但仍然提供了足够的抽象。这种方法一开始似乎很赚钱,但从长远来看,它会产生非常混乱的代码。事实上,如果你愿意达到这样的程度,我推荐下一种方法

  • 前端框架-如果您没有特定的SEO限制,那么您当然可以转向基于前端javascript框架的体系结构。然后您只需要编写DRFAPI,所有其他代码都应该由客户机框架处理。它还可以带来更好的用户体验


  • 事情是这样的——你不能(至少不容易)。DRF程序员已经决定实现
    序列化程序
    ,作为与
    django表单
    完全不同的并行结构。事实上,他们甚至不分享任何故事。当然,您可以使用mixin在表单和序列化程序中共享代码,但是还有一些细微的差别,比如
    表单
    清除
    方法,而序列化程序有
    验证
    方法

    下面是一些可以用来最小化代码重复的策略-

  • 瘦视图和胖模型-尝试将大部分业务逻辑保留在模型中(如果它们与模型相关),或单独的域类中。视图应该只是模型和模板之间的连接,不应该包含业务或与模型相关的逻辑。这样,您编写的代码可以在django的普通视图和DRF视图中重用。如果您想进一步了解这一点,请尝试在模型级别封装全局验证和约束(即始终为true的验证),然后您可以编写某些序列化程序混合,以捕获模型中的验证错误并将其显示给用户

  • 面向服务的体系结构-尝试将所有内容编写为服务或REST API,并在正常视图中使用这些服务。我的公司有一些性能问题,所以我最终编写了一个定制的请求客户机(在django测试客户机的线路上),它实际上并不向api发出http请求,但仍然提供了足够的抽象。这种方法一开始似乎很赚钱,但从长远来看,它会产生非常混乱的代码。事实上,如果你愿意达到这样的程度,我推荐下一种方法

  • 前端框架-如果您没有特定的SEO限制,那么您当然可以转向基于前端javascript框架的体系结构。然后您只需要编写DRFAPI,所有其他代码都应该由客户机框架处理。它还可以带来更好的用户体验


  • 谢谢你和她。听起来重写的可能性很大。如果我可以问的话,这将如何成为APIView的一部分。登录需要定义我的活动(请求,关联id):我的活动=关联活动。对象。注释(act_id=F('id')、act_名称=F('ACTION_名称'))。值('act_id'、'act_名称')。过滤器(关联id=asso id)我的活动列出=列表(my_活动)活动=活动。对象。值('id'、'name')。过滤器(active='activities')(活动)回复={'my_activities':my_activities_listed,'activities':activities_listed}data=json.dumps(回复)@NieSelam抱歉你指的是什么“GET”?有什么想法吗@hspandher?谢谢@hspandher。听起来重写的可能性很大。如果我可以问一下,这个GET在APIView中会变成什么样子。登录需要定义我的活动(请求,关联id):我的活动=AssociationActivity.objects.annot
        if request.method=='POST':
    
        err_found=False
        go_id=''
    
        form=NewMemberForm(request.POST or None)
    
        if form.is_valid():
         #create user
         pass