如何在django中为每个相关对象选择一个对象?
如果我有两门课:如何在django中为每个相关对象选择一个对象?,django,django-queryset,Django,Django Queryset,如果我有两门课: class Group(models.Model): name = models.CharField(...) class Item(models.Model): group = models.ForeignKey(Group) published = models.DateTimeField(auto_now_add=True) def myview(request): groups = Group.objects.filter()
class Group(models.Model):
name = models.CharField(...)
class Item(models.Model):
group = models.ForeignKey(Group)
published = models.DateTimeField(auto_now_add=True)
def myview(request):
groups = Group.objects.filter()
[.........]
如何进行查询集以从每个组中选择最新发布的项目?我想应该是这样的
Item.objects.order_by('published').distinct('group')
def myview(request):
groups = Group.objects.filter()
[.........]
但是我不能让它工作。models.py
class Group(models.Model):
name = models.CharField(max_length=100)
def __unicode__(self):
return self.name
def latest_published(self):
items = Item.objects.filter(group=self)[:1]
for item in items:
return item.published
return ''
class Item(models.Model):
group = models.ForeignKey(Group)
published = models.DateTimeField()
def __unicode__(self):
return "{0}".format(self.published)
class Meta:
ordering = ('-published',)
def myview(request):
groups = Group.objects.filter()
[.........]
视图.py
def myview(request):
groups = Group.objects.filter()
[.........]
模板
def myview(request):
groups = Group.objects.filter()
[.........]
{% for group in groups %}
{{group}} - {{group.latest_published}}<br/>
{% endfor %}
{%用于组中的组%}
{{group}}-{{group.latest_published}}
{%endfor%}
如果您不介意将所有项目从数据库加载到内存中,并且希望在单个查询中完成此操作,则可以执行此操作。在我的场景中,大约有8个“项目”和4个“组”,所以这样做几乎不算是一个性能上的成功
def myview(request):
groups = Group.objects.filter()
[.........]
from itertools import groupby
items = [list(g)[0] for k, g in groupby(Item.objects.all().order_by('group', '-published'), lambda x: x.group_id)]
添加。如果希望能够访问组对象,请在内部查询集中选择\u related('group')
def myview(request):
groups = Group.objects.filter()
[.........]
它在做什么?
def myview(request):
groups = Group.objects.filter()
[.........]
对不起,我不明白。我以为Item.objects.filter(group=self)[:1]只会返回一个对象?@ersran9,问题是
如何进行查询设置以从每个组中选择最新发布的项目?
。此查询Item.objects.filter(group=self)[:1]
返回每个groupWell中最新发布的项目(一个项目)。那么,您的代码不也返回一个项目吗?由于在循环中返回。@ersran9每组一项,这就是要求