Не найдено ни одного крепления X

Я использую Django 1.6, и я использую Юг для обработки миграции. В большинстве моих приложений у меня были файлы initial_data.json. Я преобразовал их для загрузки с миграциями, а не автоматически с помощью Django (как это рекомендуется в документации)

Я использовал версию 0.8.2 юга, когда я столкнулся с странным поведением/ошибкой, где загрузка светильников выполняется в соответствии с кодом модели, а не с состоянием миграции. Я видел, что с последней версии (0.8.4) добавлены некоторые исправления ошибок, связанные с loaddata, поэтому я обновился до него.

Теперь я получаю следующую ошибку во всех миграциях, которые загружают приборы:

UserWarning: No fixture named 'X' found. 

Когда я использую Django loaddata, он отлично работает. Любые идеи о том, как это решить?

Ответ 1

Юг и светильники

Юг просто исправляет syncdb, чтобы пропускать загрузку прибора для моделей с миграциями и фактически загружает их после завершения последней миграции для приложения.

Убедитесь, что файл initial_data находится в нужном месте

Загрузка исходных_данных не требует, чтобы вы действительно что-то делали, но поместите светильники в правильное место, как описано в документации Django.

Чтобы процитировать документы:

По умолчанию Django просматривает каталог приборов внутри каждого приложения для светильники. Вы можете установить для параметра FIXTURE_DIRS список дополнительных каталоги, в которых должен выглядеть Django.

Это означает, что если у вас есть приложение под названием "myapp", вы создадите в нем "fixtures" и разместите там json, например: myproject/myapp/fixtures.

Django 1.7 и более новый

Django 1.7 представил встроенные миграции. У них есть интерфейс, похожий на Юг; команды управления для создания миграций makemigrations, запустите их migrate и другие.

Однако, теги initial_data больше не загружаются автоматически при запуске syncdb; если он не является существующим приложением и не имеет миграций. Это упомянутое в примечаниях к выпуску.

Документы теперь рекомендуют создать datamigration для обработки загрузки прибора. К счастью, это довольно легко сделать, вот как я обычно это делаю:

1. создайте пустую миграцию данных

$ python manage.py makemigrations --empty myapp

Если у вас была только начальная миграция, вы попадаете в эти файлы (обратите внимание, что я переименовал миграцию 0002 для ясности):

myapp/
├── __init__.py
├── fixtures
│   └── my_initial_data.json
└── migrations
    ├── 0001_initial.py
    ├── 0002_load_fixture.py
    └── __init__.py

2. обновите код 0002_load_fixture.py, чтобы запустить loaddata​​h3 >

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations
from django.core.management import call_command


def load_my_initial_data(apps, schema_editor):
    call_command("loaddata", "my_initial_data.json")


class Migration(migrations.Migration):
    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(load_my_initial_data),
    ]

Ответ 2

Почему бы вам не запустить команду loaddata comand из вашей миграции?

import datetime
from south.db import db
from south.v2 import DataMigration
from django.db import models

class Migration(DataMigration):

    def forwards(self, orm):
        from django.core.management import call_command
        call_command("loaddata", "my_fixture.json")

Ответ 3

Если вы все еще получаете ошибку:

Нет привязки с именем "X"

Попробуйте использовать путь к json файлу, так как manage.py, вероятно, не запускается из каталога проекта (его можно даже запустить из корневого каталога). Попробуйте что-то вроде этого:

import os

app_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))
json_path = os.path.join(app_path, 'fixtures', 'my_fixture.json')
call_command("loaddata", json_path)