Django Queryset - 获取最后一个相关对象并按其数据进行过滤

时间:2015-09-11 16:56:02

标签: python django django-orm

我有两个Django模型:

class Person(models.Model):
    unique_id = models.CharField()

class PersonData(models.Model):
    person = models.ForeignKey('Person')
    phone = models.CharField()
    email = models.CharField()
    date = models.DateTimeField()

新的PersonData对象在其信息发生变化时会被添加,但旧的PersonData对象会被保留。然后我想要一个过滤器,它将根据与他们相关的最新filter_email = "email@example.com" filter_phone = "964477425" qs = Person.objects.all() if filter_email: qs = qs.filter(persondata__email__icontains=filter_email) if filter_phone: qs = qs.filter(persondata__phone__icontains=filter_phone) 对象的数据来过滤人。

我有以下查询集:

PersonData

但该过滤器会搜索与Person相关联的每个PersonData对象。是否可以将此过滤器仅限制为最新的Image.FromFile(file)对象?

2 个答案:

答案 0 :(得分:1)

这是一种流行的查询类型,其中需要针对一个字段的唯一值的最新/最旧条目。

我想说的是,如果你仔细思考其他答案所暗示的内容,你就会明白它们并没有达到目的。

无法在单个 django 查询(GraphAPIError: (#4) Application request limit reached)中使用所需过滤器获取whole object

我知道解决此问题的方法之一是在Note that it is possible to get one field but not all fields, also it is possible to fetch all fields in raw **sql** queries中使用外键到最新的Person对象,并在每次PersonData的新对象时更新它创建

答案 1 :(得分:-2)

因此,您可以尝试查询PersonData模型:

qs = PersonData.objects.filter()

if filter_email:
    qs = PersonData.objects.filter(email__icontains=filter_email)
if filter_phone:
    qs = PersonData.objects.filter(phone__icontains=filter_phone)

# Cache Person object and pick the last
qs = qs.select_related('person').last()