【问题标题】:Django: How to create a Group through a command?Django:如何通过命令创建组?
【发布时间】:2019-05-05 06:57:15
【问题描述】:

我想在我的数据库上自动创建所有数据,为此我使用不同的命令。

我知道如何为我的模型执行此操作,因为我知道它的字段。

但是如何为 Group 模型做到这一点?

from django.contrib.auth.models import Group

当我查询它的字段时,我得到:'user', 'id', 'name', 'permissions'

[f.name for f in Group._meta.get_fields()]

但在管理面板中,我只看到为了创建组,namepermission 字段是必需的:

命令

import pandas as pd
from django.contrib.auth.models import Group
from django.core.management.base import BaseCommand



tmp_data_groups=pd.read_csv('static/data/groups.csv',sep=',', encoding='iso-8859-1').fillna(" ")



class Command(BaseCommand):
    def handle(self, **options):
        groups = [
            Group(
                name=row['name'],
                permissions=row['permissions']
        )
            for _, row in tmp_data_groups.iterrows()
        ]

        Group.objects.bulk_create(groups)

我收到此错误(使用命令或在 shell 中):

TypeError:直接分配到多对多集合的前端 被禁止。请改用 permissions.set()。

使用外壳的示例:

我有一个名为“Clientes”的组,它已分配所有权限。

Group.objects.all()[0].permissions.all() #Clientes is the only group created

我想创建一个名为“NuevosClientes”(英文为NewClients)的新组。

Group.objects.create(name='NuevosClientes', permissions='Can view user')

试过了,但成功了:

TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use permissions.set() instead.

我应该如何准备要读取的 CSV 字段并使用命令生成所需的新组?

| name           | permissions        |   |   |   |
|----------------|--------------------|---|---|---|
| NuevosClientes | Can view user      |   |   |   |
| NuevosClientes | Can add permission |   |   |   |
| NuevosClientes | Can delete user    |   |   |   |
| NuevosClientes | Can delete cart    |   |   |   |

更新 1

我已经创建了我的组,但现在我需要创建要添加到这些组的权限。

但为了创建权限,我还需要创建 ContentType 对象。

然而,ContentType 对象有这些参数。

content_type = ContentType.objects.get(app_label='app_name', model='model_name')

根据另一篇文章中的这个说法,每次我们在django_content_type 表中创建一个条目时,都会在该表中为所述模型添加一条新记录。

我应该使用什么条目来创建 ContentType 对象? app_label='app_name' 和 model='model_name' 的值应该是什么?

django_content_type 表中有很多条目:

`logentry`, `permission`, `group`, `user`, `contenttype`, `session`, and also for my own models. 

【问题讨论】:

  • 您只能在创建对象后 设置m2m 关系中的值。表单只是让这更方便。
  • 我不确定,但我认为问题在于您需要先创建 Group 对象,然后才能将 permissions 添加到,因为连接它们的内部表将需要 Group 的 pk .尝试创建您的组,然后为每一行使用 permissions.add
  • @HenryM 我会试试这个方法。有了这个,我需要可能的 2 个命令来自动创建组及其权限。我会在几个小时后发布结果。
  • @WillemVanOnsem 我认为这与 HenryM 提到的相同,请确认。

标签: django


【解决方案1】:

您只能将项目添加到多对多关系,前提是与该关系相关的对象已保存。

所以你可能首先要保存你构建的Group,然后添加权限。注意Permission [Django-doc]也是一个模型,所以这里不能只使用字符串。

您的命令将如下所示:

from django.contrib.auth.models import Group, Permission

# ...

g1 = Group.objects.create(name=row['name'])
p1, __ = Permission.objects.get_or_create(name=row['permissions'])
g1.permissions.add(p1)

因此,我们首先构造一个具有给定名称的Group 对象,然后检索相关的Permission 对象,然后将该权限p1 添加到给定组的permissions。如果可以有多个权限,则需要使其更复杂一些。

您仍然可以通过执行两遍来使用bulk_create:首先构建具有给定名称的所有组,然后在第二遍中检索所有相关权限并正确设置这些权限。

【讨论】:

  • @OmarGonzales:您不能在列表理解子句中进行分配。此外,如前所述,您需要分两次执行此操作。首先创建所有组,例如使用bulk_create,然后执行链接,而不是交错。
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多