Джанго: Как создать группу с помощью команды? - PullRequest
1 голос
/ 05 мая 2019

Я хочу автоматизировать создание всех данных в моей базе данных, для этого я использую разные команды.

Я знаю, как это сделать для моих моделей, потому что я знаю их поля.

Но как это сделать для модели группы?

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)

Я получаю эту ошибку (с командой или в оболочке):

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. 

1 Ответ

1 голос
/ 05 мая 2019

Вы можете добавлять элементы в отношение «многие ко многим», только если объекты, связанные с этим отношением, уже сохранены.

Итак, вы, вероятно, сначала хотите сохранить созданный вами 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, выполнив два прохода: сначала вы строите все группы с заданными именами, а затем во втором проходе вы получаете все связанные разрешения и устанавливаете их правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...