Django Rest Framework过滤相关的模型字段

时间:2018-03-18 17:42:20

标签: django django-rest-framework

我无法给出一个合适的头衔。

这些是我的模特:

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方式。

1 个答案:

答案 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)