Пользовательская миграция Django RunPython не может получить доступ к полю ForeignKey в другой базе данных - PullRequest
0 голосов
/ 08 ноября 2019

Я пишу операцию миграции django, чтобы изменить некоторые данные в базе данных по умолчанию. Мое приложение имеет доступ к базе данных 'services', которая содержит данные, которые я не могу изменить.

Два соответствующих поля в файле default.table:

data_sets_to_remove = models.CharField(blank=True, null=False, max_length=100, default="")
data_sets_new = ArrayField(models.IntegerField(null=True, blank=True), null=True, blank=True)

т.е. я мигрируюданные из data_sets_to_remove в новый формат и добавление в data_sets_new. Для этого мне нужно получить доступ к данным из базы данных «services» в процессе миграции.

def forwards_func(apps, schema_editor):
    DataRelease = apps.get_model('registry', "datarelease")
    Survey = apps.get_model('registry', "survey")
    data_release_queryset = DataRelease.objects.using('services').all().values('id', 'name', 'survey')

Но по какой-то причине поле внешнего ключа «survey» в модели DataRelease в этом случае недоступно. контекст.

django.core.exceptions.FieldError: Невозможно преобразовать ключевое слово 'survey' в поле. Выбор: id, имя

Может кто-нибудь пролить свет на это? Я предполагаю, что проблема заключается в доступе к данным из вторичной базы данных в рамках операции миграции, но если я запускаю тот же код в консоли, он работает нормально ...

Соответствующие модели Survey и DataRelease в базе данных служб:

class Survey(models.Model):
    name = models.CharField(blank=False, null=False, max_length=100, unique=True)


class DataRelease(models.Model):
    name = models.CharField(blank=False, null=False, max_length=100)
    survey = models.ForeignKey(Survey, related_name='data_releases', on_delete=models.CASCADE)

1 Ответ

1 голос
/ 08 ноября 2019

: facepalm:

Ответ смотрел мне в лицо. Переключен импорт связанных моделей с:

DataRelease = apps.get_model('registry', "datarelease")
Survey = apps.get_model('registry', "survey")

на:

from services.registry.models import DataRelease, Survey

Теперь я могу получить доступ к связанным полям в операции миграции. Надеюсь, это поможет кому-то еще в будущем!

...