Django:如何组织这个大型模型/经理/设计混乱?

oro*_*aki 3 django django-models django-managers

总结一下,在我进入不好的例子之前,等等:我正在尝试创建一个应用程序,我不必在所有模型中编写代码来限制当前登录帐户的选择(我没有使用身份验证或帐户或登录的内置功能).

也就是说,我希望有做这样的事情:

class Ticket(models.Model):
        account = models.ForeignKey(Account)
        client = models.ForeignKey(Client)  # A client will be owned by one account.
        content = models.CharField(max_length=255)

class TicketForm(forms.ModelForm):
        class Meta:
                model = Ticket
                exclude = ('account',)  #First sign of bad design?

        def __init__(self, *args, **kwargs):
                super(OrderForm, self).__init__(*args, **kwargs)
                if self.initial.get('account'):
                        # Here's where it gets ugly IMHO. This seems almost
                        # as bad as hard coding data. It's not DRY either.
                        self.fields['client'].queryset = Client.objects.filter(account=self.initial.get('account'))
Run Code Online (Sandbox Code Playgroud)

我的想法是Account(models.Model)使用以下自定义管理器创建一个模型,并使用所有模型的多表继承对其进行子类化.它给了我一个巨大的脑痛.我还需要account每个型号的外键吗?我可以访问某个模型实例的父类帐户吗?

class TicketManager(models.Manager):
    def get_query_set(self):
        return super(TicketManager, self).get_query_set().filter(account=Account.objects.get(id=1))
        # Obviously I don't want to hard code the account like this.
        # I want to do something like this:
        # return super(ProductManager, self).get_query_set().filter(account=self.account)
        # Self being the current model that's using this manager
        # (obviously this is wrong because you're not inside a model
        # instance , but this is where the confusion comes in for me.
        # How would I do this?).
Run Code Online (Sandbox Code Playgroud)

请忽略任何明显的语法错误.我在这里输入了这整件事.

这就是我有想法这样做的地方:Django Namespace项目

Van*_*ale 7

Django有两个密切相关的问题.

一种是行级权限,其中用户/帐户需要特定权限才能查看表中的特定行(对象),而不是具有表级权限的普通Django auth框架.

您链接到的项目是尝试实现行权限的几个项目之一. django-granular-permissions是另一个和第三个(我最喜欢和最活跃/维护的)是django-authority.

即将发布的Django 1.2将有一些钩子使得行级权限更容易实现,而django-authority作者将致力于集成他的项目.

第二个相关问题是称为多租户数据库,它是行权限的变体.在此方案中,您可能拥有来自单个公司的多个用户,例如,所有用户都可以访问该公司的数据,但不能访问其他公司(租户).

我不认为这是你正在寻找的,但你可能能够使用一些相同的技术.了解如何在Django多租户django应用程序中强制实现帐户分离.两者都有非常稀疏的答案,但它们是一个起点,同时也是Rails应用程序和本文的多租户架构.

至于对您的问题的更具体的答案,我认为您应该使用django-authority或编写自定义管理器并在开发期间使用记录所有权筛选器来验证您的查询是否绕过自定义管理器.

  • 完美,你明白我在做什么完美.感谢您抽出宝贵时间提供所有信息.我正在开发一个SAAS,它将有多个帐户(希望如此),每个帐户都有多个用户.用户不是一个大问题,因为我将在视图级别编写一些基本的@accountowneronly类型装饰器,以便帐户管理员必须是帐户所有者或我自己的超级用户变体才能访问某些视图.对我来说,最大的问题是建立一个高效且可扩展的架构,这样我几乎可以编码,好像我只为一个帐户开发这个. (2认同)