2010-10-11 6 views
2

C'est une question extrêmement naïve. Comme vous pouvez le constater, cela vient de quelqu'un qui ne connaît pas grand-chose des bases de données ou de Django.Quels sont les avantages de l'utilisation de ForeignKey dans Django?

Quels sont les avantages de l'utilisation ForeignKeys dans Django? Peut-être qu'un exemple m'aidera à mieux comprendre. J'ai déjà des tableaux comme celui-ci:

City: 
    id = IntegerField() # e.g. 15 
    name = CharField() # e.g. 'Rome'  
Country: 
    name = CharField() e.g. 'Italy' 
    capital = IntegerField() # e.g 15 

Dois-je prendre la peine de changer le capital à ForeignKey(City), et si oui, pourquoi? Est-ce que certaines choses deviennent plus rapides, plus pratiques ou mieux?

merci!

Répondre

2

En utilisant Django ForeignKeys permet de "savoir" sur les relations. Ainsi, vous pouvez suivre les relations sans se soucier de la façon dont ils sont stockés, par exemple, vous pouvez effectuer les opérations suivantes sans avoir à prendre soin comment la relation est stockée:

country = Country.objects.get(pk=1) 
print country.capital.name 
italy = Country.objects.get(capital__name="Rome") 

également pour garder les contraintes Django suivre les relations lors de la suppression d'objets qui sont référencés par un ForeignKey. Django garde également la trace des relations inverses (sans avoir besoin de les définir explicitement), donc vous pouvez faire quelque chose comme countries = rome.country_set.all() (ce qui n'a pas beaucoup de sens dans cet exemple, puisqu'il serait plus logique de utiliser un OneToOneField ici ...

4

Les clés étrangères sont contraintes sur votre modèle de données qui vous permettent d'assurer la cohérence. En fait, dans votre exemple, si vous n'avez pas capital comme ForeignKey à un City il pourrait contenir un id d'un City qui n'existait pas! Lorsque vous utilisez ForeignKey à la place, il place une contrainte sur la base de données afin que vous ne pouvez pas enlever des choses qui sont actuellement référencées par d'autres choses. Donc, si vous avez essayé de supprimer le nom City"Rome" avant de supprimer le nom Country"Italy" qui a cette ville comme capitale, il ne vous permettra pas. En utilisant ForeignKey à la place, vous vous assurez que vous n'avez jamais eu à vous soucier de savoir si la «chose» à l'autre bout de la relation était toujours là ou non.

0

intégrité référentielle Otoh il est tout à fait possible d'avoir une base de données qui ne connaît ni ne se soucie FKS -.. en fait, je travaille avec un héritage db comme celui-ci au travail

Questions connexes