2010-01-25 1 views
0

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

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 - я не знаю, как они представлены на уровне базы данных).

ответ

0

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

Обратная ссылка действительно создана 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 

You может читать о таких запросах в documenation.

+0

Спасибо за совет! Это чужой код, который я пытаюсь выяснить - я не был уверен, что циклические отношения были в порядке или даже возможны! –