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= 的新对象时更新它] 已创建。
我有两个 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= 的新对象时更新它] 已创建。