Обратная связь внешних ключей в Django - PullRequest
0 голосов
/ 23 октября 2019

У меня есть две таблицы, связанные через внешние ключи.

Models.py

class Foo(models.Model):
    A = models.DateField(default=datetime.now)
    B = models.IntegerField(default=0)
    C = models.IntegerField(default=0)

class Bar(models.Model):
    X = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='foo_a')
    Y = models.CharField(default=0)
    Z = models.CharField(default=0)

Views.py

def foo_details(request):

    query = Foo.objects.all()

    return render(request, 'foodetails.html', {'query': inward})

HTML

    <thead>
    <tr>
        <th>A</th>
        <th>B</th>
        <th>C</th>
        <th>Y</th>
        <th>Z</th>
    </tr>
    </thead>
    <tbody>
        {% for i in query %}

           <tr>
            <td class="align-middle">{{ i.A }}</td>
            <td class="align-middle">{{ i.B }}</td>
            <td class="align-middle">{{ i.C }}</td>
            <td class="align-middle">{{ i.?? }}</td>
            <td class="align-middle">{{ i.?? }}</td>

           </tr>

Как я могу показать соответствующее поле модели бара в моем шаблоне?

Если запрос в моих представлениях был Bar.objects.all(), то в моих шаблонах я мог бы легко сделать

<td class="align-middle">{{ i.X.A }}</td>

Но как я могу использовать обратное отношение?

Ответы [ 3 ]

2 голосов
/ 23 октября 2019

ForeignKey - это отношение многие-к-одному ;у вас есть много баров, связанных с вашим Foo. Вам нужно перебрать их, используя related_name.

{% for i in query %}
   <tr>
    <td class="align-middle">{{ i.A }}</td>
    <td class="align-middle">{{ i.B }}</td>
    <td class="align-middle">{{ i.C }}</td>
    {% for bar in i.foo_a.all %}
    <td class="align-middle">{{ bar.Y }}</td>
    <td class="align-middle">{{ bar.Z }}</td>
    {% endfor %}
   </tr>
{% endfor %}
1 голос
/ 23 октября 2019

Вы можете просто получить доступ к обратному отношению (для экземпляра Foo) через instance.foo_a (для этого и используется related_name)

В шаблоне вы будете использовать что-то вроде этого:

{% for obj in instance.foo_a %}
    <td> {{ obj.A }} </td>
{% endfor %}

Эквивалентом этому будет instance.bar_set.all

1 голос
/ 23 октября 2019

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

def foo_details(request,pk):
    foo_obj = Foo.obejcts.get(pk=pk)
    query = Foo.objects.all()
    bar = Bar.objects.filter(x=foo_obj)

ИЛИ если вы хотите обработать это только в вашем шаблоне, вы можете попробовать так:

{% for i in query %}
         <tr>
            <td class="align-middle">{{ i.A }}</td>
            <td class="align-middle">{{ i.B }}</td>
            <td class="align-middle">{{ i.C }}</td>
{% for bar in i.foo_a.all %} # if you don't specify related_name it will be i.modelname_set.all
            <td class="align-middle">{{ bar.x }}</td>
{% endfor %}

           </tr> 
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...