Как получить поле дочерних объектов в django

#django #python-3.x

#django #python-3.x

Вопрос:

Я пишу приложение django, и мне нужно получить доступ к полю дочерних объектов в admin и шаблонах: мои модели:

 class House(models.Model):
    doc_code = models.IntegerField()
    ...
    def getGuardian(self):
       guardian = self.person_set.filter(membership=1)
       return guardian
    def __str__(self):
       return "Family: "   str(self.doc_code)
class Person(models.Model):
    family = models.ForeignKey(House)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    ...
def __str__(self):
    return self.last_name   ' '   self.first_name
  

в поле зрения:

 houses = House.objects.order_by('doc_code')
  

в шаблоне:

 <li>{{house.doc_code}} {{house.getGuardian}}</li>
  

Я получаю:

 1 [<Person: Smith John>]
  

Как я могу избавиться от «[ < Person:….> ]» и просто отобразить имя?
Также как я могу изменить заголовок поля getGuardian на странице администратора?

Комментарии:

1. Я не знаю, просто ли код неправильно скопирован, но второй метод __str__() не предназначен должным образом, поэтому он теперь не принадлежит модели

2. просто скопируйте и вставьте, я не могу указать идентификатор здесь 🙂

3. Что вы имеете в виду, вы не можете? Вы должны, иначе строковое представление модели было бы общим, что является вашей проблемой atm.

Ответ №1:

Во-первых, если вы не хотите, чтобы оно отображалось в скобках [] , вам нужно вернуть один объект вместо списка. Если запрос для guardian всегда будет возвращать один элемент, вы могли бы сделать что-то вроде

 def getGuardian(self):
    guardian = self.person_set.get(membership=1)
    return guardian
  

И guardian будет одним Person объектом.

Во-вторых, чтобы изменить представление с <Person: Smith John> на просто Smith John , вы должны настроить __repr__ метод вашей модели, а не __str__ метод:

 def __repr__(self):
    return self.last_name   ' '   self.first_name
  

Я не уверен, действительно ли вы хотите это сделать, потому что это заставит эти объекты отображаться в виде строк, что в некоторых случаях может вводить в заблуждение, но это зависит от вас. Возможно, вам лучше получить имя опекуна в вашем представлении и передать его в контекст или просто getGuardian вернуть имя опекуна для начала:

 def getGuardianName(self):
    guardian = self.person_set.get(membership=1)
    return str(guardian)