Django自定义模型管理器和Modeladmin

时间:2019-02-15 21:44:32

标签: python django

我有一个名为article的应用程序。我想用hidden = True隐藏文章。除管理员外,所有隐藏的文章均不可找到。

我正在使用自定义管理器,并且正在使用自定义Modeladmin。

我的自定义模型管理员:

class ArticleAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(hidden=False)

我的自定义经理:

class ArticleManager(models.Manager):
    def get_queryset(self):
         qs = super().get_queryset()
         return qs.filter(hidden=False)

当我使用hidden = False时,我想使用Article.objects.all()来获取所有文章,并且在管理面板中时,我也想使用hidden = True来获取文章。

管理面板->所有文章 Article.objects.all()->所有带有hidden = False

的文章

工作原理: 当我使用Article.objects.all()时,我得到的所有文章都带有hidden = False

什么不起作用: 在管理控制台上时,看不到任何带有hidden = True的文章。

仅在管理面板中带有hidden = True的文章应该可见。在Sitemaps的Querysets中,不应返回它们。

1 个答案:

答案 0 :(得分:0)

首先,更好的做法是将QuerySet定义为自定义内部类,然后将其传递给管理器。然后,您有各种选择-您可以定义两个查询集并为管理员使用一个特定的查询集,也可以在完成后直接在经理类中进行用户权限检查,例如,回答此问题。然后,您只需使用wanted_text = "python-1u222-ea-str-b08" test = "python-1u222-ea-str-b08-10_dec_2018.zip" if wanted_text in test: print("Hurray") else: print("doesn't match") ,它将为不同的用户返回不同的结果。

Custom QuerySet and Manager without breaking DRY?

希望这会有所帮助^^