Правильный способ доступа к связанным объектам - PullRequest
2 голосов
/ 30 октября 2009

У меня есть следующие модели

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)  

Как получить доступ к номерам телефонов, связанным с сотрудником, если у меня есть идентификатор сотрудника?

В настоящее время я использую

phones = PhoneNumbers.objects.filter(person__id=employee.id)
и это работает только потому, что я знаю, что employee.id и person.id имеют одинаковое значение, но я уверен, что это неправильный способ сделать это.

Спасибо
Andrew

Ответы [ 2 ]

5 голосов
/ 30 октября 2009

Вы можете (и должны) фильтровать, не зная поля внешнего ключа:

PhoneNumber.objects.filter(employee=your_employee).all()
4 голосов
/ 30 октября 2009

Вы можете сделать:

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

Это даст вам все ваши телефонные номера в одном запросе БД.

По умолчанию вы можете получить доступ к моделям, связанным с помощью внешней клавиши на «противоположной» стороне, используя «имя модели во всех строчных буквах», за которым следует «_set». Вы можете изменить имя этого метода доступа, установив соответствующее свойство name для постороннего ключа.

...