【问题标题】:Django: create new user with field which has ManyToMany relationshipDjango:使用具有多对多关系的字段创建新用户
【发布时间】:2021-05-01 13:29:02
【问题描述】:

您好,因为我是新手,我正在尝试在帐户字段上创建一个具有多对多关系的新用户:

models.py

    class User(AbstractBaseUser, PermissionMixin):
        id = models.UUIDField(primary_key=True)
        name = models.CharField(max_length=250),
        account = models.ManyToManyField(
          'accounts.Account',
          'through=’Membership'
        )

    class Account(models.Model):
        id = models.UUIDField(primary_key=True)
        name =  models.CharField(max_length=250),

    class Membership(models.Model):
        id = models.UUIDField(primary_key=True)
        account = models.ForeignKey(‘accounts.Account’)
        permissions = models.ManyToManyField(‘accounts.Role’)

我需要实现的是从api创建新用户后,我需要得到这个JSON:

{
    id: 1,
    name: 'User 1',
    accounts: [
        {
            id: 1,
            name: 'account1',
            permissions: [
                {
                    id: 1,
                    name: 'permission1'
                }
            ]
        },
        {
            id: 2,
            name: 'account2',
            permissions: [
                    {
                         id: 1,
                         name: 'permission'
                    },
                    {
                        id: 2,
                        name: 'permission2'
                    }
            ]
        }
    ]
}

到目前为止,我只有这个,我想知道如何处理具有 MAnyToMany 关系的帐户...

user = models.User.objects.create_user(
name='user 2',
accounts= ????
)

```’

Do I need to pass an array with accounts ids? but then how I can set the permission ? …

Thanks in advanced!!

【问题讨论】:

    标签: django api rest django-models django-rest-framework


    【解决方案1】:

    这里有一些东西要解压。

    1. 您可以并且可能应该通过两个单独的步骤创建用户并将用户添加到帐户。不过,如果您想一步完成,只需创建一个自定义管理器并将一些 DB 语句包装在一个事务中即可。

    2. 我猜你所说的PermissionMixin 是指PermissionsMixin 来自django.contrib.auth.models。请注意,它会添加组,然后您将权限添加到组,将用户添加到组。所以它可能会already provide you 满足您的需求。

    3. 当您创建 m2m through 时,它必须对两个模型都有 fk。所以这里Membership 需要对UserAccount 都有一个fk。

    4. the docs 中解释了如何创建 m2m 实体(例如在您的自定义管理器中)。

    5. 已经有比 Django 自带的更复杂权限的库。如果不需要,不要尝试重新发明轮子。

    【讨论】:

    • 非常感谢汤姆!我正在听从您的建议,一切都按预期进行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多