/ / Чому Django створює файли міграції для проксі-моделей? - пітон, джанго, проксі-класи

Чому Django створює файли міграції для проксі-моделей? - python, django, proxy-classes

Я щойно створив проксі-модель і здивувався тому 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)