2010-10-16 6 views
0

J'ai des tables Django comme les suivants (je l'ai retiré des champs non essentiels):Interrogation sur les tables de base de données

class Person(models.Model): 
    nameidx = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=300, verbose_name="Name")  
class Owner(models.Model): 
    id = models.IntegerField(primary_key=True) 
    nameidx = models.IntegerField(null=True, blank=True) # is Person.nameidx 
    structidx = models.IntegerField() # is PlaceRef.structidx 
class PlaceRef(models.Model): 
    id = models.IntegerField(primary_key=True) 
    structidx = models.IntegerField() # used for many things and not equivalent to placeidx 
    placeidx = models.IntegerField(null=True, blank=True) # is Place.placeidx 
class Place(models.Model): 
    placeidx = models.IntegerField(primary_key=True) 
    county = models.CharField(max_length=36, null=True, blank=True) 
    name = models.CharField(max_length=300) 

Ma question est la suivante. Si dans mon fichier views.py, une personne est référencée par son nom et que je souhaite connaître tous les lieux qu'elle possède en tant que QuerySet, que dois-je faire?

Je peux en arriver là:

person = Person.objects.get(name=name) 
owned_relations = Owner.objects.filter(nameidx=nameidx) 

Comment puis-je obtenir d'ici à la Place? Dois-je utiliser des méthodes de base de données?

Je ne suis pas sûr si je devrais utiliser ForeignKey pour, par exemple. Owner.nameidx.

Merci et excuses pour cette question extrêmement basique. Je ne sais pas comment apprendre les bases de requêtes de base de données, sauf en essayant, à défaut, demander SO, d'essayer à nouveau ... :)

Répondre

1

Le point entier des clés étrangères est pour des utilisations comme le vôtre. Si vous savez déjà que Owner.nameidx fait référence à une personne, pourquoi ne pas en faire une clé étrangère (ou un champ OneToOne) dans la table Person? Non seulement vous obtenez l'avantage de l'intégrité référentielle - il est impossible d'entrer une valeur pour nameidx qui n'est pas une personne valide - Django ORM vous donnera la possibilité de « suivre » les relations facilement:

owned_places = Place.objects.filter(placeref__owner__person=my_person) 

vous donnera tous les lieux détenus par my_person. Incidemment, vous n'avez pas besoin de définir les champs de clé primaire séparés - Django le fera pour vous, et en fera des champs auto-incrémentés, ce qui est presque toujours ce que vous voulez.

+0

Merci pour l'explication claire - cela va rendre la vie beaucoup plus facile :) – AP257

0

Si u pourrait redesign.Then

In owner nameidx can be a foreign key to Person(nameidx) 
Placeref(structidx) could be a foreign key to Owner(structidx) and 
Place(placeidx) could be a foreign key Place ref(placeidx) 

alors u pourrait en déduire la place valeur facilement ..

Questions connexes