Циркулярная зависимость в Django ForeignKey? - PullRequest
2 голосов
/ 27 октября 2011

У меня есть две модели в Джанго:

A:
  b = ForeignKey("B")

B:
  a = ForeignKey(A)

Я хочу, чтобы эти ForeignKeys были ненулевыми.

Однако я не могу создать объекты, потому что у них нет PrimaryKey, пока я не сохраню (). Но я не могу сохранить без других объектов PrimaryKey.

Как я могу создать объекты A и B, которые ссылаются друг на друга? Я не хочу разрешать NULL, если это возможно.

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Похоже, вы говорите об отношениях один-к-одному, и в этом случае нет необходимости хранить внешний ключ в обеих таблицах. Фактически, Django предоставляет хороших помощников в ORM для ссылки на соответствующий объект.

Использование Django's OneToOneField:

class A(models.Model):
    <snip>

class B(models.Model):
    a = OneToOneField(A)

Тогда вы можете просто ссылаться на них так:

a = A()
a.save()
b = B(a=a)
b.save()

print a.b
print b.a

Кроме того, вы можете посмотреть django-раздражающий AutoOneToOneField, который автоматически создаст связанный объект при сохранении, если он не существует в экземпляре.

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

0 голосов
/ 27 октября 2011

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

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

...