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

时间:2009-10-22 10:53:14

标签: 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)

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

Thanx很多。


这是保存对象的一部分,但纯粹是精心设计,而不是必要的阅读。

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

def save(self, userid):  
    self.created_by = userid    
    super(Customer, self).save(userid)

在视图中:

if form.is_valid():
    customer = form.save(commit=False)
    customer.save(request.user)

这样我就不需要在customer.save...

之前的视图中显示以下行
    customer.created_by = request.user

因此减少了错误。

2 个答案:

答案 0 :(得分:5)

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

class CustomerManager(models.Manager):
    def get_user_records(self, user):
        return self.filter(created_by=user)

我会让get_query_set无法重复,因为我觉得在你的情况下无法覆盖它。

答案 1 :(得分:0)

我认为最好的地方可能在你的观点中 - 虽然我可能是错的。在self.created_by = userid方法中添加save()无法保护人们免于查看信息。只是保存它。

如果您使用自定义管理器作为默认查询集,则20%的观看次数将会失败。

我认为您需要一个视图 - 为什么不创建一次自己的通用视图然后重复使用它?

def object_detail_user_only(request. queryset, **kwargs):
    queryset = queryset.filter(created_by=request.user)

    return list_detail.object_detail(request,queryset,**kwargs)

那样的东西(未经测试)?