я решил подобную проблему сегодня - необходимости выполнить миграцию, чтобы создать новую модель, но только для БД Postgres - и я нашел этот вопрос. Однако ответ Мэтью не помог мне. На самом деле, я не уверен, что он работает вообще. Это потому, что строка с migrations.RunSQL(...)
фактически не run SQL; он создает новый объект типа RunSQL
, который является Command
, а затем сразу же отбрасывает его.
Вот как я в конечном итоге решить эту проблему, в случае, если кто-то пытается искать «Джанго условной миграции» в будущем:
from __future__ import unicode_literals
import django.contrib.postgres.fields
from django.db import migrations, models
class PostgresOnlyCreateModel(migrations.CreateModel):
def database_forwards(self, app_label, schema_editor, from_state, to_state):
if schema_editor.connection.vendor.startswith("postgres"):
super(PostgresOnlyCreateModel, self).database_forwards(app_label, schema_editor, from_state, to_state)
def database_backwards(self, app_label, schema_editor, from_state, to_state):
if schema_editor.connection.vendor.startswith("postgres"):
super(PostgresOnlyCreateModel, self).database_backwards(app_label, schema_editor, from_state, to_state)
class Migration(migrations.Migration):
dependencies = [
...whatever...
]
operations = [
PostgresOnlyCreateModel(
name='...whatever...',
fields=[...whatever...],
),
]
Моя строка поставщика был 'postgresql' и не' postgres' (в Django 1.10.6) –
Проблема с этим состоит в том, что 'migrations.RunSQL()' возвращает объект. Он фактически не выполняет какой-либо SQL до тех пор, пока не будет вызван метод '_run_sql()' этого объекта с определенными параметрами. См. Ответ PaulMest для решения, которое также использует метод 'migrations.RunPython()', но выполняет SQL таким образом, который фактически выполняет SQL. – radicalbiscuit