访问表C中具有表B中的FK的最后一行,该行与A一对一关系

时间:2018-09-15 18:31:27

标签: django

假设我们有3个模型:

class A(models.model):
    name = models.CharField(max_length=30, unique=True)


class B(models.model):
    name = models.CharField(max_length=30, unique=True)
    a = models.OneToOneField(A, on_delete=models.CASCADE, primary_key=True)

class C(models.model):
    name = models.CharField(max_length=30, unique=True)
    b = models.ForeingKey(B, on_delete=models.CASCADE)
    transaction_count = models.IntegerField(default=0)

和一个视图:

class AListView(generic.ListView):
    model = A

在该视图(模板)中,我需要显示:b的每个存储库的A名称,B名称和“ transactioncount”的最后一行(按日期排序)。

在我的模板中,我遍历A中的项目并按以下方式显示它们:

{% for a in A %}
<tr>
    <td>{{a.name}}</td>
    <td>{{a.b.name}}</td>
    <td>{{??? Don't know what to put here, to show the last row. I tried: a.b.c|last}}</td>
</tr>
{% endfor %}

我试图构建自定义标签并使用类似模板的功能,但不幸的是,该方法不起作用:

{% with a.b.c_set.all|last as val %}
    <td>val</td>
{% endwith}

在其他尝试中,我将尝试构建一个新的查询集,但是我不知道如何将模型A中的项目分配给该查询集。我尝试过:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context.update({
        'A': A.objects.all(),
        'c_data': C.objects.order_by('B', '-date').distinct(
            'B')
    })
)

做到这一点的最佳“ pythonic”方法是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

首先,不要忘记将反向关系名称设置为:

b = models.ForeingKey(B, on_delete=models.CASCADE, related_name='all_c')

然后:

class B(models.model):
    name = models.CharField(max_length=30, unique=True)
    a = models.OneToOneField(A, on_delete=models.CASCADE, primary_key=True)

    @property
    def last_c(self):
        if self.all_c.exists():
            return self.all_c.order_by('-date').last()

在您的jinja模板中,只需输入:

a.b.last_c

玩得开心!