Django:如何访问视图中的向后关系列表?

2024-06-28 20:34:21 发布

您现在位置:Python中文网/ 问答频道 /正文

假设,我有一个叫鸡的模型:

class Chicken(models.Model):
    name = models.CharField(max_length=30)

我还有一个叫Egg的模型,它有一个与鸡模型相似的外键:

^{pr2}$

现在我想创建一个视图,其中包含所有鸡的列表以及它们产蛋的日期。在

我知道怎么用这样的方法把鸡下的蛋都弄出来:

c = Chicken.objects.get(name='Henry')
e = c.egg_set.all()

但这没什么用,因为我有很多鸡,我只想知道它们最新的蛋的日期。我也不知道如何将这些鸡蛋信息放入我的视图中以便于访问。在我看来,我想做这样的事情:

{% for chicken in chickens %}
    <p>{{ chicken.name }} layed is last egg on {{ chicken.last_egg }}</p>
{% endfor %}

这可能是一个非常基本的问题,但我只是一个初学者,我将非常感谢你能给予的任何帮助。在这种情况下,Django文档并不能真正帮助我。在


Tags: name模型视图modeleggmodelslengthmax
2条回答

我个人喜欢用@property注释来解决在模型中注释方法的问题。在

例如:在你的鸡模型中,你会有一个方法,比如:

@property
def last_egg(self):
    return self.egg_set.order_by('-layed_on')[0]

在模板中,可以将其用作常规模型字段。在

^{pr2}$

另外,我想知道这个解决方案是否有任何问题,以及你们对它的看法。 也许我们可以好好谈谈如何巧妙地解决这个问题。在

希望有帮助。在

您需要的是django的注释feature。基本上,您需要用egg's layed\u的Max来注释chicken中的每一行。如果没有提示就在我面前,我不能保证下面的陈述是准确的,但它应该给你一个起点。在

编辑你的鸡模型如下:

class Egg(models.Model):
    chicken = models.ForeignKey(Chicken, related_name='eggs')
    layed_on = models.DateField(auto_add_now=True)

from django.db.models import Max
Chicken.objects.annotate(last_egg=Max('eggs__layed_on'))

相关问题 更多 >