首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:如何通过命令创建一个组?

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

Stack Overflow用户
提问于 2019-05-05 06:57:15
回答 1查看 1.7K关注 0票数 2

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

我知道如何为我的模特做这件事,因为我知道它的领域。

,但是如何对组模型这样做呢?

代码语言:javascript
复制
from django.contrib.auth.models import Group

当我查询它的字段时,我得到:'user','id','name',‘权限’

代码语言:javascript
复制
[f.name for f in Group._meta.get_fields()]

但是在Admin中,我只看到为了创建一个组,需要namepermission字段:

命令

代码语言:javascript
复制
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()代替。

使用外壳的示例:

我有一个叫“客户”的小组,它分配了所有的任务。

代码语言:javascript
复制
Group.objects.all()[0].permissions.all() #Clientes is the only group created

我打算创建一个名为"NuevosClientes“的新组(英文为NewClients)。

代码语言:javascript
复制
Group.objects.create(name='NuevosClientes', permissions='Can view user')

我试过但得到了:

代码语言:javascript
复制
TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use permissions.set() instead.

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

代码语言:javascript
复制
| name           | permissions        |   |   |   |
|----------------|--------------------|---|---|---|
| NuevosClientes | Can view user      |   |   |   |
| NuevosClientes | Can add permission |   |   |   |
| NuevosClientes | Can delete user    |   |   |   |
| NuevosClientes | Can delete cart    |   |   |   |

更新1

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

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

无论如何,ContentType对象都有这些参数。

代码语言:javascript
复制
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表中有很多条目:

代码语言:javascript
复制
`logentry`, `permission`, `group`, `user`, `contenttype`, `session`, and also for my own models. 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-05 07:08:00

如果已经保存了与该关系相关的对象,则只能将项添加到多到多的关系中。

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

因此,您的命令如下所示:

代码语言:javascript
复制
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:首先使用给定的名称构造所有组,然后在第二次传递中检索所有相关权限并正确设置这些权限。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55989579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档