2009-10-29 8 views
2

j'ai les modèles suivantsfaçon correcte d'accéder aux objets liés

class Person(models.Model): 
    name = models.CharField(max_length=100) 

class Employee(Person): 
    job = model.Charfield(max_length=200) 

class PhoneNumber(models.Model): 
    person = models.ForeignKey(Person) 

Comment accéder aux PHONENUMBERS associés à un employé si je l'id employé?

Actuellement, je suis en utilisant

phones = PhoneNumbers.objects.filter(person__id=employee.id)
et il ne fonctionne que parce que je sais que le employee.id et person.id sont la même valeur, mais je suis sûr que c'est la mauvaise façon de le faire.

Merci
Andrew

Répondre

4

Vous pouvez faire:

employees = Employee.objects.filter(id=your_id).select_related() 
if employees.count() == 1: 
    phone_numbers = employees[0].phonenumber_set.all() 

Cela devrait vous obtenir tous les numéros de téléphone dans une requête db.

Par défaut, vous pouvez accéder aux modèles liés via une clé étrangère du côté "opposé" en utilisant "nom du modèle en minuscules" suivi de "_set". Vous pouvez modifier le nom de cet accesseur en définissant la propriété de nom associée de la clé étrangère.

+1

Pas besoin de vérifier la longueur. Employee.objects.select_releated() get (id = VOTRE_ID) .phonenumber_set.all() –

+0

Si vous faites un get sur un objet qui n'existe pas, il déclenchera une exception. Vous devriez TOUJOURS soit faire un filtre et vérifier la longueur ou envelopper l'obtenir dans un essai/sauf. Votre réponse est correcte, mais votre commentaire est un mauvais conseil. –

+0

Je savais qu'il y avait une façon correcte de le faire, je ne pouvais pas le comprendre. Merci pour votre aide. –

5

Vous pouvez (et devez) filtrer sans connaître le champ de clé étrangère:

PhoneNumber.objects.filter(employee=your_employee).all() 
+0

Exactement, vous n'avez même pas besoin de comparer les champs d'identification, les modèles le font automatiquement. – Soviut