2015-09-11 51 views
3

我有兩個Django模型:添加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 protected]" 
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對象?

回答

1

這就是對一個領域的唯一值最新/最舊的條目都期望查詢的普及型。

我想說,如果你認爲其他答案深深地暗示着,你會明白它們不能達到目的。

沒有方法在單一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對象外鍵,並更新相關PersonData每次創建新對象。

+0

你說得對。擁有最新的PersonData對象的外鍵將使事情變得更容易。 – Mark

+0

是的,它會和你的查詢完全一致,現在假設你把外鍵字段命名爲persondata,儘管我建議把它命名爲'latest_data' :)。 –

-1

所以,你可以嘗試查詢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() 
+1

這不會導致每個Person的最新'PersonData'對象,而不是最後一個通過過濾器的PersonData對象。 –