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

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

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

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

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

определяю свое право в Мета классе модели:
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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.01.2020, 15:36
Ответы с готовыми решениями:

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

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

Не могу сделать миграцию после добавления функций блога
Делал все по инструкции http://aldryn-newsblog.readthedocs.io/en/latest/introduction.html#database-migrations Прошу помощи. Буду...

2
 Аватар для m0nte-cr1st0
1043 / 578 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
17.01.2020, 17:50
Интересный кейс. Странно, что не работает.
Отпиши, если разберёшься, как работает.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
Сообщений: 146
17.01.2020, 17:58  [ТС]
посмотрю, спасибо.
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2020, 17:58
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru