Я щойно створив проксі-модель і здивувався тому manage.py makemigrations
створює новий файл міграції з migrations.CreateModel
операції.
Проксі-модель не створює нову таблицю бази даних, це просто інший інтерфейс python до того ж набору даних і справді manage.py sqlmigrate my_app_label 0042
нічого не повертає.
Я думав, що це може бути використане для створення проксі-моделі ContentType, але вони створюються на вимогу, якщо вони не існують.
Чи використовується для запуску створення дозволів проксі-моделі? Є 6-річна відкрита помилка щодо дозволів на проксі-модель, тому я не дуже впевнений, як ця частина повинна працювати зараз ...
Це використано Django 1.8
протестувати це.
Редагувати: уточнити, Django
створює міграцію, яка нічого не робить для нових моделей проксі, тому не хочеться Django
не створювати міграцію в першу чергу, якщо це не має користі?
Чи є випадок використання, коли було б корисно провести міграцію?
Відповіді:
10 за відповідь № 1Так, але якщо ви відкриєте міграцію у своєму редакторі, ви побачите, що це фактично порожня міграція! Ось приклад
class Migration(migrations.Migration):
dependencies = [
("stackoverflow", "0009_auto_20160622_1507"),
]
operations = [
migrations.CreateModel(
name="MyArticle",
fields=[
],
options={
"proxy": True,
},
bases=("stackoverflow.article",),
),
]
І якщо ви зробите ./manage.py sqlmigrate myapp 0010
(яке число відповідає мій міграції вище), що я отримую, це те, що "в наступному рядку (нічого)
Це тому, що fields
розділом міграції є і proxy = True
. Це запобігає виконанню будь-якого SQL для цієї міграції, і початкова таблиця залишається недоторканою.
Тож ви можете запитати, чому джанго намагається створити порожню міграцію? Це тому, що модель проксі може бути передана іншою моделлю в майбутній міграції.
0 для відповіді № 2
я вірю migrations
створюються тому, що на бази даних це впливає і migrations
- як змінюється база даних сигналів Джанго. Структура не змінюється, але записи додаються (принаймні) у дві таблиці:
- Нове
ContentType
додається доdjango_content_type
для моделі проксі. - Додавання, характерні для моделі проксі, додаються до
auth_permission
. Я припускаю, що це "завжди" відбувається, якщо неproxy використовує точно таку ж назву класу. Це, безумовно, буває - ми фактично використовуємо проксі-модель для доступу до Користувача з використанням різних дозволів, не торкаючись моделі користувача за замовчуванням.
Обидві ці деталі фактично відзначені уланцюжок коментарів щодо проблеми, пов’язаної з ОП (наприклад, коментар №31), оскільки вони сприяють появі помилок (тобто те, що Джанго шукає дозволи в додатку, відмінному від того, який фактично створено в auth_permissions
)