Как получить родителя от ребенка ФК? - PullRequest
2 голосов
/ 12 апреля 2020

models.py

class Product(models.Model)
 name = models.CharField()

class User(models.Model)
 name = models.CharField()

class List(models.Model)
 user = models.ForeignKey(User)

class Item(models.Model)
 name = models.CharField()
 list = models.ForeignKey(List)
 user = models.ForeignKey(User)
 product = models.ForeignKey(Product)

views.py

class ListView(View)
  def get(self, request, pk)
    list = List.objects.get(id=pk)
    return render(request, "list.html", {"list" : list})

список. html

{% for item in list.item_set.all %}
  {{ item.name }}
  {{ item.user.name }} - ??
  {{ item.product.name }} - ??
{% endfor %}

Как получить user.name и product.name ?

Я пробовал:

  1. {% item.user_set.first.name %} - не работает

  2. {% for user in item.user_set.all %}{{ user.name }}{% endfor %} - не работает

  3. Метод модели:

    def get_user(self): 
        self.user_ser.get() #does not work
    

Как мне решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2020

От пользователя: {{user.items}} # to access to the items objects
От элемента: {{item.user.name}} # to access to the user name field

class Item(models.Model)
 name = models.CharField()
 list = models.ForeignKey(List)
 user = models.ForeignKey(User, related_name='items')
 product = models.ForeignKey(Product)
3 голосов
/ 12 апреля 2020

Поскольку Item имеет ForeignKey к Product объекту, вы можете получить доступ к связанному объекту с помощью item.product, поэтому вы можете отобразить его с помощью:

{{ item<b>.product.name</b> }}
{{ item<b>.user.name</b> }}

Если вы используете стандартный User модуль, это {{ item.user.username }}. Возможно, это пусто, например, если name соответствующего пользователя является пустой строкой ''.

Однако для более эффективного извлечения элементов может быть лучше выполнить .prefetch_related(..) [Django -doc] для извлечения этих элементов в массовом :

class ListView(View)
  def get(self, request, pk)
    list = List.objects<b>.prefetch_related('item_set', 'item_set__product', 'item_set__user')</b>.get(id=pk)
    return render(request, "list.html", {'list' : list})
0 голосов
/ 12 апреля 2020

Работает! Моя ошибка заключалась в том, что я посмотрел на имена полей в базе данных, а не в файле models.py. Они разные.

Спасибо за помощь!

Все ответы выше верны!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...