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

Django Queryset - get last related object and filter by it's data

我有两个 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)

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

所以您可以尝试查询 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()

这是一种流行的查询类型,需要 latest/oldest 条目针对一个字段的唯一值。

我想说的是,如果你深入思考其他答案的建议,你就会明白它们并没有达到目的。

无法在单个 django 查询 (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) 中获取具有所需过滤器的 whole object

我知道解决这个问题的方法之一是在 Person 中有一个指向最新 PersonData 对象的外键,并在每次 [=13= 的新对象时更新它] 已创建。