我无法给出一个合适的头衔。
这些是我的模特:
class User(models.Model):
# standard django User model from django.contrib.auth.models
class Person(models.Model):
name = models.CharField(...)
class Note(models.Model)
person = models.ForeignKey(Person, related_name='PersonNote')
ower = models.ForeignKey(User)
date_added = models.DateTimeField(auto_now_add=True)
我想过滤所有人,ID = 5的用户的最后一个注释中有动作=' helloed'。
让所有注意到他们的人都是“他妈的”#39;并注意owner = 5的工作原理如下:
Person.objects.filter(PersonNote__action='helloed', PersonNote__owner=5)
但是,上述内容并没有考虑到,只有这样的人才会被退回,其最后一个音符有“你好”的动作,只要“你好”和“#”;是其中一个注意事项。
伪SQL可能是这样的:
SELECT
name from person,
action, date_added from note,
id from user
WHERE
1 = 1
AND action = 'helloed'
AND id = 5
AND date_added = MAX(date_added)
我知道这可以通过原始sql查询完成,但我想将其插入到视图中,因此我更喜欢django ORM方式。
答案 0 :(得分:1)
如果我理解你的问题,这可能会解决你的问题
from django.db.models import Max
max_date = Note.objects.aggregate(max_date=Max('date_added'))['max_date']
Person.objects.filter(PersonNote__action='helloed',
PersonNote__ower_id=5,
PersonNote__date_added=max_date)
的更新-1 强>
这将按操作分组,
from django.db.models import Max
Note.objects.values('person__name').annotate(last_date=Max('date_added'))
的更新-2 强>
from django.db.models import Max
person_name = [agg['person__name'] for agg in Note.objects.values('person__name').annotate(last_date=Max('date_added'))]
Person.objects.filter(name__in=person_name)