Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 2
Регистрация: 12.07.2013
Сообщений: 144
1

Как сделать зависимую миграцию

17.01.2020, 15:36. Показов 937. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос про порядок исполнения нескольких миграций.

Задача: Мне нужно добавить кастомное право в модель, и добавить это право в две группы,
так, чтобы это можно было оформить коммитом и соотв. задеплоить(т.е. ручной способ через админку я знаю).
Хотел сделать это миграциями.

определяю свое право в Мета классе модели:
Python
1
2
3
4
5
6
   ...
  class Meta:
        permissions = (
            ('can_chpok_user', 'может чпокать юзеров'),
        )    
  ...
генерю миграцию(допустим имя у нее будет migration_А):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2020-01-17 12:00
from future import unicode_literals
 
from django.db import migrations
 
class Migration(migrations.Migration):
 
    dependencies = [
        ('core', '0010_auto_20200116_0055'),
    ]
 
    operations = [
        migrations.AlterModelOptions(
            name='yesuser',
            options={'permissions': (('can_chpok_user', 'может чпокать юзеров'),)},
        ),
    ]
дальше пишу такую миграцию(допустим ее имя migration_B):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
from django.contrib.auth.models import Group, Permission
from django.db import migrations
...
 
def add_chpok_perm(apps, schema_editor):
 
    can_chpok_user = Permission.objects.get(codename='can_chpok_user')
    lookup_groups = Group.objects.filter(name__in=('Оператор Чпока', 'МегаЧпокер'))   
 
    for g in lookup_groups:
        g.permissions.add(can_chpok_user)
 
 
class Migration(migrations.Migration):
    atomic = True
    dependencies = [
        ('core', 'migration_A'),
    ]
 
    operations = [
        migrations.RunPython(add_chpok_perm, reverse_code=migrations.RunPython.noop),
    ]
т.е. предполагая что сначала будет выполнена миграция А(потому что B зависит от А), в миграции B хочу найти уже созданную запись права и добавить ее в нужные группы.
Выполняется так: миграция А применяется, а вот в миграции B ошибка - не найдена соотв. запись Permission.
Пробовал это сделать с atomic=True, но результат такой же.
Пробовал в миграцию А добавить вторую операцию(по сути все то что есть в миграции B) - тот же эффект - запись в БД не создается.
Причем, если выполнять только А, то все нормально. Право создается, все стандартно. Но мне нужно не только само право, но и назначение этого права нужным группам.
Юзеркейс то в этом и заключается...

читал когда то что миграции применяются "скопом", т.е. сначала формируется sql скрипт который будет применяться - от всех миграций к-е нужно выполнить, и соотв. дальше уже будет неизвестный порядок транзакций. Как тогда мне сделать такой сценарий?

================================================================================ ===
В итоге пришлось писать совсем сыро, в одну миграцию и без class Metа,
а хотелось бы с ним - чтобы видеть в коде кастомные права модели,

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
...
from django.contrib.auth.models import Group, Permission
from django.db import migrations
...
 
def add_chpok_perm(apps, schema_editor):
    chpok_desc = {
        'content_type_id': 13,
        'codename': 'chpok',
        'name': 'может чпокать юзеров'
    }
 
    perm = Permission.objects.create(**chpok_desc)
    perm.save()
 
    lookup_groups = Group.objects.filter(name__in=('Оператор Чпока', 'МегаЧпокер'))
    can_chpok_user = Permission.objects.get(codename='can_chpok_user')
 
    for g in lookup_groups:
        g.permissions.add(can_chpok_user)
 
 
class Migration(migrations.Migration):
    atomic = True
    dependencies = [
        ('core', 'chpok_migration'),
    ]
 
    operations = [
        migrations.RunPython(add_chpok_perm, reverse_code=migrations.RunPython.noop),
    ]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2020, 15:36
Ответы с готовыми решениями:

Как сделать фикстуру или миграцию данных
Доброго времени суток, есть задание с которым не сталкивался на данный момент. Создать фикстуру...

Не могу сделать миграцию бд на сервере
Не могу сделать миграцию бд на сервере (хостинг pythonanywhere). В директории с manage.py в...

Не могу сделать миграцию после добавления функций блога
Делал все по инструкции...

Как сделать миграцию в райдере?
Уже несколько часов бьюсь над проблемой с Rider, пытаюсь сделать миграцию. но меня он просто...

2
1042 / 577 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
17.01.2020, 17:50 2
Интересный кейс. Странно, что не работает.
Отпиши, если разберёшься, как работает.3

Доступ к моделям осуществляется через

Python
1
apps.get_model
Может, свою операцию написать придётся.

Посмотри в сторону

Python
1
2
3
4
def database_forwards(self, app_label, schema_editor, from_state, to_state):
    # This operation should have access to all models. Ensure that all models are
    # reloaded in case any are delayed.
    from_state.clear_delayed_apps_cache()
https://docs.djangoproject.com... perations/
0
1 / 1 / 2
Регистрация: 12.07.2013
Сообщений: 144
17.01.2020, 17:58  [ТС] 3
посмотрю, спасибо.
apps.get_model, тоже пробовал:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# -*- coding: utf-8 -*-
# Generated by Django 1.9.3 on 2020-01-17 12:41
from __future__ import unicode_literals
 
from django.db import migrations
 
def add_perm(apps, schema_editor):
 
    groups = apps.get_model('auth', 'Group')
    permissions = apps.get_model('auth', 'Permission')
 
    lookup_groups = groups.objects.filter(name__in=('Оператор', 'Моделлер'))
    perm = permissions.objects.get(codename='can_chpok_user')
 
    for g in lookup_groups:
        g.permissions.add(perm)
 
 
class Migration(migrations.Migration):
 
    dependencies = [
        ('core', '0010_auto_20200116_0055'),
    ]
 
    operations = [
        migrations.AlterModelOptions(
            name='yestimateuser',
            options={'permissions': (('can_chpok_user', 'может чпокать юзеров'),)},
        ),
        migrations.RunPython(add_perm, reverse_code=migrations.RunPython.noop),
    ]
ошибка:
File "...\venv\lib\site-packages\django\db\models\query.py", line 387, in get
self.model._meta.object_name
__fake__.DoesNotExist: Permission matching query does not exist.
0
17.01.2020, 17:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2020, 17:58
Помогаю со студенческими работами здесь

Как сделать динамическую точность физики, зависимую от скорости объекта?
Здраствуйте, я хотел бы узнать как можно реализовать разное число вызовов физики у разных объектов....

Не могу сделать зависимую подстановку
Суть базы заключается в учете поступления и выдачи картриджей со склада. Есть 2 таблицы "приход" и...

Сделать группу чекбоксов, зависимую от одного тз нее
Начинающий программист знающий впф и допнет, но не учивший яву:( <asp:CheckBoxList...

Как сделать миграцию, которая добавляет в таблицу с проектами строку "Цвет"?
Как сделать логику хранения в виде одной строки, если она не заполнена - выводится ЦБ цвет при...

Почему не получается сделать миграцию?
Добрый вечер! Возникла проблема, при выполнении миграции возникает ошибка - SQLSTATE ...

Как отменить последнюю миграцию
ДОбрый день, подскажите пожалуйста как можно отменить последние шаги я работала в new_branch...

как запустить одну корректную миграцию
Не могу запустить миграцию 2014_10_12_100000_create_password_resets_table php artisan migrate -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru