(Django)我的模型管理方法应该在哪里?

时间:2016-06-09 08:40:25

标签: python django

情况

我正在使用Django创建我的网站。我正试图让它结构化。

DjangoUser中提供Groupdjango.contrib.models

在我的应用board中,有Board型号。

每个Board都有GroupUser的可访问,可读,可评论,可写的权限。这是由额外模型BoardPermission管理的,该模型与ManyToManyField(auth.User, through='BoardPermission')模型中的Group相关。

因此,在db中,BoardPermission有4个字段:idboard_idgroup_idpermissionpermission的值由0(可访问),1(可读),2(可评论),3(可写)设置。

问题

现在,问题在于:

例如,如果用户输入名为noticehttp://example.com/board/notice/)的典型电路板,则服务器必须检查用户的权限。或者,在主页面上,用户可以看到用户可以访问的主板的预览,在这种情况下,服务器应该知道给定用户可以看到的主板列表

要处理上述两种情况,我想制作一种方法has_permission(self, user, board, permission)get_permitted_user_list(self, user, permission)

然后,这两种方法应该在哪里?在modelview

案例1)在模型中实施

权限是BoardGroup之间的关系,而不是User。处理QuerySet只能在Board个对象中完成。我很难从BoardUser之间的关系中获得BoardGroup之间的关系。

我检查了ModelManager,但我不知道如何通过使用经理来解决这个问题。

案例2)在视图中实施

有两个简单的问题:1)这些方法被广泛使用,并且在典型视图中的实现似乎是 not structful ,或者换言之,遵守{{1}的哲学}或Django。 2)在所有方面,这些方法都适用于Python,因为它们处理模型之间的关系。所以我认为它应该是模型层。

此外,如果视图中的实现是标准,那么为什么Models层中存在ModelManager

摘要(很好地忘记了上述所有讨论)

ModelDjango。但MVT无处不在。

data中的方法(处理数据)可以在Model中调用。即使在View没有参数!

当然,这种方法可以放在Template

M,V,T的角色之间的基本标准是什么?

1 个答案:

答案 0 :(得分:0)

我的解决方案是在available_for(user)BoardManager中使用BoardQuerySet方法(取决于您决定哪个方法作为开发基础,每个方法都可以自动配置/从另一个生成。)

您将能够使用其他管理器方法将其链接,因此过滤,查找等将起作用,您将能够使用视图的Board.DoesNotExist例外的默认行为。

Board.objects.published().recent().available_for(user).filter(name=name)[:1].get()