【发布时间】: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()]
但在管理面板中,我只看到为了创建组,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()。
使用外壳的示例:
我有一个名为“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