Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:如何减少视图的大小并提高视图的内聚性_Python_Django_Django Views - Fatal编程技术网

Python Django:如何减少视图的大小并提高视图的内聚性

Python Django:如何减少视图的大小并提高视图的内聚性,python,django,django-views,Python,Django,Django Views,随着我的项目越来越大,我开始得到非常大的CBV,因为它们需要处理很多功能,特别是通过AJAX(单页应用程序样式)实时响应 例如,我有classScheduledBooking。它可以在一个页面中显示预订时间线、预订约会以及查看/编辑其他约会 我使用各种模型经理进行复杂的过滤/聚合,但不确定是否将这些经理的角色职责扩展到处理预订操作,如分配预订、检查预订可用性、广播预订更改(即使他们使用其他模型)是一种有益的做法?这将旨在减少视图的大小并提高视图的内聚性(尽管模型管理器随后将承担影响其自身内聚性级

随着我的项目越来越大,我开始得到非常大的CBV,因为它们需要处理很多功能,特别是通过AJAX(单页应用程序样式)实时响应

例如,我有class
ScheduledBooking
。它可以在一个页面中显示预订时间线、预订约会以及查看/编辑其他约会

我使用各种模型经理进行复杂的过滤/聚合,但不确定是否将这些经理的角色职责扩展到处理预订操作,如分配预订、检查预订可用性、广播预订更改(即使他们使用其他模型)是一种有益的做法?这将旨在减少视图的大小并提高视图的内聚性(尽管模型管理器随后将承担影响其自身内聚性级别的工作负载)。还是有更好的方法/替代方法

另一个问题是来自AJAX调用的实时响应。虽然操作处理阻塞了很多视图,但由于采用了单页应用程序样式,我使用了大量。我想知道是否有其他地方或方法可以处理这件事

class ScheduledBooking(TemplateView、BetterPerformSchoiceValidationMixin、SessionHandlerMixin、BookingMixin、AjaxFormSerialiseMixin):
模板名称='emissions\u dashboard/booking\u scheduled.html'
def获取上下文数据(自身):
[…20行..]
返回参数
def get(自我、请求、*args、**kwargs):
[…2行..]
返回呈现(请求,self.template\u name,self.get\u context\u data())
def检查可用性(自身、开始日期时间、结束日期时间):
''检查预订时段是否仍然可用并返回True
如果符合标准
'''
[…10行…]
返回错误
def分配预订(自我、请求的开始日期时间、请求的结束日期时间、预订id):
''通过将状态更改为“已分配”来分配预订。
阻止其他用户使用时间段
'''
[…10行…]
def实时响应(自我、请求、预订id):
如果request.POST中有“复制表单”:
''如果预订需要复制,则在此处处理
'''
[…30行…]
返回JsonResponse({'form\u validate':False,'form\u errors':replicate\u form.errors})
如果request.POST中有“更改日期”:
''允许用户更改预订日期范围
'''
[…20行…]
返回JsonResponse({'valid_dates':False,'booking_html':None})
[…又有8个实时响应处理(400多行)…]
def广播(自我、预订、类型=无):
''通过'django频道'向其他用户广播更改'
'''
[…100行…]
def楼宇记录(自我、请求、表格、预订id):
''处理提交后需要重定向的主预订表单(非ajax)
'''
[…30行…]
def post(自我、请求、预订id=无、房间名称=”、*args、**kwargs):
''处理所有post请求
'''
if request.is_ajax():
live_response=self.live_response(请求、预订id、*args、**kwargs)
如果现场响应:
返回实时响应
[…50行…]

我理解这是一个相当主观的问题,但很高兴听到其他想法/建议来帮助我学习。

这里经常引用的原则是:“胖模特,瘦观点”。此外,正如你正确提到的,还有肥胖经理


原则上,所有模型方法都应该仅将您的数据库作为其唯一依赖项。在处理外部API时,将功能捆绑在单独的模块中。大部分业务逻辑也可以卸载到utils.py文件(utils\u broadcast.py,…)

是的,我认为最好不要扩展经理的这一能力。我想我要寻找的是一种更为传统的方式来构造这些util文件,但从我所读到的来看,似乎没有已知的“标准”。实际上,对于utils*.py文件似乎没有一个通用的解决方案。我的过程看起来是这样的:1)简单的方法:将逻辑移到models/managers/utils*.py;2) 复杂方法:创建基于类的逻辑;3) 副作用(如统计、变更记录等):创建微服务并发送指令。