2011-10-26 6 views
2

J'ai deux modèles de Django:Dépendance circulaire dans Django ForeignKey?

A: 
    b = ForeignKey("B") 

B: 
    a = ForeignKey(A) 

Je veux que ces ForeignKeys soient non NULL.

Cependant, je ne peux pas créer les objets car ils n'ont pas de PrimaryKey tant que je n'enregistre pas(). Mais je ne peux pas enregistrer sans avoir les autres objets PrimaryKey.

Comment créer un objet A et B qui se réfèrent l'un à l'autre? Je ne veux pas autoriser NULL si possible.

Répondre

0

S'il s'agit réellement d'un problème d'amorçage et qu'il ne se reproduira pas lors d'une utilisation normale, vous pouvez simplement créer un dispositif qui préremplira votre base de données avec des données initiales. Le code de gestion des fixtures inclut des solutions de contournement à la couche de base de données pour résoudre le problème de référence directe. Si ce n'est pas un problème d'amorçage, et que vous voulez créer régulièrement ces relations circulaires entre de nouveaux objets, vous devriez probablement soit reconsidérer votre schéma - l'une des clés étrangères est probablement inutile.

0

Il semble que vous parlez d'une relation un-à-un, auquel cas il est inutile de stocker la clé étrangère sur les deux tables. En fait, Django fournit de belles aides dans l'ORM pour référencer l'objet correspondant.

En utilisant Django OneToOneField:

class A(models.Model): 
    <snip> 

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

Ensuite, vous pouvez simplement les référencer comme ceci:

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

print a.b 
print b.a 

En outre, vous pouvez regarder dans django-annoying « s AutoOneToOneField, qui créera automatiquement l'associé object on save s'il n'existe pas sur l'instance.

Si votre problème n'est pas une relation biunivoque, vous devez clarifier car il existe presque certainement une meilleure façon de modéliser les données que les clés étrangères mutuelles. Sinon, il n'y a pas moyen d'éviter de définir un champ obligatoire lors de la sauvegarde.

+2

Il ne s'agit pas d'une relation de type un-à-un. –