DRY:仅显示用户拥有的记录.可以使用models.Manager吗?

Ger*_*dJP 1 django django-models

我需要向用户显示他拥有的对象.由于我需要在超过80%的观看次数上执行此操作,因此硬编码会导致DRY死亡.更重要的是,用户永远不会看到其他人拥有的记录.手工完成(在所有视图中)似乎也容易出错.

我一直在寻找装饰器(如login_required),但这似乎在请求处理过程的早期.是否可以将request.user值获取到自定义编写的管理器中并执行以下操作:

class CustomerManager(models.Manager):
    def get_query_set(self):
        return super(CustomerManager, self).get_query_set().filter(created_by=request.user)
Run Code Online (Sandbox Code Playgroud)

或者经理对象就像'不去!' 就请求信息而言,作为模型定义?

非常感谢.


这是保存对象的一部分,但纯粹在这里作为详细说明,而不是必要的阅读.

保存部分相对安全.我更改了模型上的object.save()函数,因此它将userid作为parm.

def save(self, userid):  
    self.created_by = userid    
    super(Customer, self).save(userid)
Run Code Online (Sandbox Code Playgroud)

在视图中:

if form.is_valid():
    customer = form.save(commit=False)
    customer.save(request.user)
Run Code Online (Sandbox Code Playgroud)

这样我以前不需要在我的视图中使用下面的行 customer.save...

    customer.created_by = request.user
Run Code Online (Sandbox Code Playgroud)

从而减少了错误.

sha*_*nyu 5

为什么不定义在CustomerManager中为用户提取记录的方法:

class CustomerManager(models.Manager):
    def get_user_records(self, user):
        return self.filter(created_by=user)
Run Code Online (Sandbox Code Playgroud)

我会留下get_query_set未经重复的,因为我认为在你的情况下没有任何好处可以覆盖它.