Django设计问题

发布于 2024-09-18 01:16:24 字数 255 浏览 5 评论 0原文

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

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

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

我需要如何以及在哪里实现此类功能?

I have a model in django that have a boolean private/public attribute:

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

I want that every-time I query this model in an application it returns only public instances to the common user and all available instances to the super-user.

How and where I need to implement such functionality?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

近箐 2024-09-25 01:16:24

您可以在视图层实现该逻辑,可能使用 自定义管理器

您的经理看起来像这样:

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()

You implement that logic at the view layer, probably with a custom manager.

Your manager would look something like this:

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

Your model would look something like:

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

You could then write a function that picked the right manager:

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

Then in your view you could use:

test_objects_for_user(request.user).all()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文