Django设计问题

时间:2010-09-08 14:08:10

标签: django django-queryset

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

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

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

我需要如何以及在何处实施此类功能?

1 个答案:

答案 0 :(得分:4)

您可以在视图层实现该逻辑,可能使用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()