knu*_*uck 8 django django-models django-managers
我跟着这个例子,它的伟大工程,但我想知道如果我可以把一个例外,这样,当我在管理中的所有对象显示(有效和无效).这可能很简单,但我无法在文档中找到如何做到这一点.
这是我的经理现在的样子:
class ShareManager(models.Manager):
def get_query_set(self):
return super(ShareManager, self).get_query_set().filter(active=True)
Run Code Online (Sandbox Code Playgroud)
我想到了几种解决方案:
使用ModelAdmin.queryset()定义用于更改列表的查询集.
在您的模型上安装2个管理器,管理员找到的第一个管理器将用作默认的AFAIK.
class SomeThing(models.Model):
objects = models.Manager()
shares = ShareManager()
Run Code Online (Sandbox Code Playgroud)在自定义管理器上添加新方法,该方法仅返回活动内容并get_query_set默认保留.
class ShareManager(models.Manager):
def get_active_items(self):
return self.get_query_set().filter(active=True)
Run Code Online (Sandbox Code Playgroud)跟进
我认为在你的情况下最合适的解决方案是结合#1和#2的变体.
设置自定义的经理为objects使每个人都可以访问它(我想这应该为你的可重用性问题的工作),并在模型上安装默认管理和使用它ModelAdmin.queryset().
class SomeThing(models.Model):
objects = ShareManager()
admin_objects = models.Manager()
Run Code Online (Sandbox Code Playgroud)
我也应该包含ModelAdmin.queryset()方法示例,所以在这里.
def queryset(self, request):
qs = self.model.admin_objects.get_query_set()
# TODO: this should be handled by some parameter to the ChangeList.
# otherwise we might try to *None, which is bad ;)
ordering = self.ordering or ()
if ordering:
qs = qs.order_by(*ordering)
return qs
Run Code Online (Sandbox Code Playgroud)
注意该行qs = self.model.admin_objects.get_query_set()正在使用admin_objects
普通管理器的实例,包括未发布的项目.
这个queryset方法实现的其余部分是默认的Django实现,通常调用qs = self.model._default_manager.get_query_set().
我希望这可以解决一些问题.
| 归档时间: |
|
| 查看次数: |
1785 次 |
| 最近记录: |