импорт базы данных геонемов в postgres для проекта django - проблема с ограничениями на использование внешнего ключа - PullRequest
0 голосов
/ 25 января 2010

В базе данных Geonames есть две модели, которые ссылаются друг на друга. В базе данных postgres ссылка обеспечивается связями внешних ключей. Проблема заключается в записи данных в базу данных - запись в одну таблицу без ссылки на идентификатор в другой таблице нарушает ограничение внешнего ключа.

Class Geoname
    id = IntegerField(primary_key=True)
    admin_1 = foreignkey('Admin1', null=True, db_index=True)

Class Admin1
    country = models.ForeignKey(Country, db_index=True)
    geoname = models.ForeignKey(Geoname, related_name="admin1_set", db_index=True)

Существует ли способ записи в базу данных postgres с этой схемой, позволяющий избежать нарушения внешних ключей?

Если нет, я думаю, что возможное решение может состоять в том, чтобы удалить admin_1 из класса geoname, но продолжит ли django использовать geoname.admin1_set? Помните, что данные пишутся непосредственно в базу данных без ORM - я думаю, что обратные отношения - это то, что создается ORM django - я не знаю, как они представлены на уровне базы данных).

1 Ответ

0 голосов
/ 25 января 2010

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

Обратная ссылка действительно создается ORM, но она создается на лету (при чтении), а не при записи.
В противном случае было бы невозможно загрузить приборы для автоматизированных испытаний ...

Это отношение один к одному? Если это так, вы можете использовать OneToOneField:

Class Geoname
    id = IntegerField(primary_key=True)
    admin_1 = OneToOneField('Admin1')

Class Admin1
    country = models.ForeignKey(Country, db_index=True)

Я надеюсь, что эти классы наследуются от django.db.models.Model в вашем реальном коде!

Если это не взаимно-однозначное отношение, вы можете сделать это:

Class Geoname
    id = IntegerField(primary_key=True)

Class Admin1
    country = models.ForeignKey(Country, db_index=True)
    geoname = models.ForeignKey(Geoname, db_index=True)

и у вас есть доступ ко всем Admin1 объектам, которые ссылаются на определенный Geoname по

g = Geoname.objects.get(id=1)
g.admin1_set.all() # Returns all Admin1 objects related to Geoname

О таких запросах можно прочитать в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...