假设我们有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”方法是什么?
谢谢
答案 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
玩得开心!