Django: общие данные дампа внешнего ключа: не удается разрешить зависимости

Я использую общие внешние ключи, чтобы связать различные профили с моим Users модель, которая унаследована от auth.User, Я не в состоянии сделать dumpdata хотя с --natural вариант пройден. Это говорит,

Ошибка: не удается разрешить зависимости для myproject.AdminProfile, myproject.TeacherProfile, myproject.Users в списке сериализованных приложений.

Согласно документации сказано, что нам нужно реализовать методы natural_key для получения и прошивки фикстур, которые включают в себя общие отношения. Как я могу сделать это с моими моделями, представленными здесь?

class Users(User):
    location = models.TextField('Location', blank=True)
    created_by = models.ForeignKey('self', null=True, blank=True, related_name='created_by_user')

    # Generic foreign key setup to hold the extra attributes
    profile_contenttype = models.ForeignKey(ContentType, null=True, blank=True)
    profile_object_id = models.PositiveIntegerField('Extra ID', null=True, blank=True)
    profile_object = generic.GenericForeignKey('profile_contenttype', 'profile_object_id')


class AdminProfile(models.Model):
    organization = models.CharField('Organization', max_length=100)

    # profile reverse relation to get the user
    users_link = generic.GenericRelation('Users', content_type_field='profile_contenttype',
                                         object_id_field='profile_object_id')

class TeacherProfile(models.Model):
    designation = models.CharField('Designation', max_length=100)

    # profile reverse to get the user
    users_link = generic.GenericRelation('Users', content_type_field='profile_contenttype',
                                         object_id_field='profile_object_id')

Использование Django 1.4.3 и Postrgres.

1 ответ

Решение

Ваша проблема, кажется, не связана с отсутствием естественных ключевых методов. Я протестировал ваш [оригинальный] код как есть на Django 1.4 и 1.2.5, используя SQLite, и смог выгрузить данные с естественными ключами без ошибок.

После некоторых поисков я обнаружил, что эта проблема возникает, когда существуют циклические зависимости между моделями (включая модели с самоссылками). Как показывает ваш обновленный код, в Users модель, вот в чем проблема. Эта ошибка была введена в Django 1.3, и, несмотря на то, что она уже исправлена, она все еще не доступна AFAIK в стабильных версиях (проверено до 1.4.3). В бета-версии (1.5b2) ваш код работает нормально.

Если использование бета-версии (или понижение до 1.2) не является вариантом, тогда единственным решением может быть создание другой модели. Что-то вроде:

class CreatedBy(models.Model):
    creator = models.ForeignKey(Users, related_name="created_by_user")
    created = models.ForeignKey(Users, unique=True, related_name="created_by")

Более общая проблема (круговые зависимости с естественными ключами, а не просто ссылки на себя с естественными ключами) - это открытая ошибка, о которой сообщается здесь: https://code.djangoproject.com/ticket/31051

Другие вопросы по тегам