我想自动化数据库中所有数据的创建,为此我使用了不同的命令。
我知道如何为我的模型执行此操作,因为我知道其领域。
但是对于组模型该怎么做?
from django.contrib.auth.models import Group
查询其字段时,我得到:“用户”,“ id”,“名称”,“权限”
[f.name for f in Group._meta.get_fields()]
但是在管理面板中,我仅看到要创建一个组,name
和permission
字段是必需的:
命令:
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.
答案 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
:首先,使用给定名称构造所有组,然后在第二遍中,检索所有相关权限并正确设置这些权限。