Django:如何通过命令创建组?

时间:2019-05-05 06:57:16

标签: django

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

我知道如何为我的模型执行此操作,因为我知道其领域。

但是对于组模型该怎么做?

from django.contrib.auth.models import Group

查询其字段时,我得到:“用户”,“ id”,“名称”,“权限”

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

使用外壳的示例:

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

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. 

1 个答案:

答案 0 :(得分: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:首先,使用给定名称构造所有组,然后在第二遍中,检索所有相关权限并正确设置这些权限。