【问题标题】:Django design questionDjango 设计问题
【发布时间】:2010-09-08 14:08:09
【问题描述】:

我在 django 中有一个具有布尔私有/公共属性的模型:

class TestModel(models.Model):
    name = models.CharField()
    is_public = models.BooleanField(default=False)

我希望每次在应用程序中查询此模型时,它只将公共实例返回给普通用户,并将所有可用实例返回给超级用户。

我需要如何以及在哪里实现这些功能?

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    您在视图层实现该逻辑,可能使用custom manager

    你的经理看起来像这样:

    class PublicTestModelManager(models.Manager):
      def get_query_set(self):
        return super(PublicTestModelManager, self).get_query_set().filter(is_public = True)
    

    你的模型看起来像:

    class TestModel(models.Model):
        name = models.CharField()
        is_public = models.BooleanField(default=False)
        objects = models.Manager() # The default manager.
        public_objects = PublicTestModelManager()
    

    然后您可以编写一个选择正确管理器的函数:

    def test_objects_for_user(user):
      if user.is_superuser:
        return TestModel.objects
      else:
        return TestModel.public_objects
    

    那么在您看来,您可以使用:

    test_objects_for_user(request.user).all()
    

    【讨论】:

    • 但是我仍然需要在每个视图中编写 if/else 子句,对吧?
    • 谢谢,对我来说似乎很复杂,我虽然可以有更简单的解决方案)
    猜你喜欢
    • 2021-04-23
    • 2010-11-23
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多