2012-05-26 80 views
3

我正在運行用戶數據的度量標準,並希望排除具有諸如「@ example.com」或「@ test.com」之類的虛假電子郵件的用戶。Django查詢集:排除使用endswith的電子郵件列表

我試圖

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....] 
Users.objects.exclude(email__endswith__in=emails_to_exclude) 

可惜,這是行不通的。看起來像endswithin不好玩對方。有任何想法嗎?

回答

9

簡單地遍歷查詢集,如QuerySets are lazy

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....] 
users = Users.objects 
for exclude_email in emails_to_exclude: 
    users = users.exclude(email__endswith=exclude_email) 
users = users.all() 
+1

簡單,正確,易於理解。構建像這樣的查詢集是構建複雜搜索工具的絕佳技術。 –

1

您可以循環瀏覽電子郵件並建立Q Object。其實,如果你很聰明,你可以做一個班輪。

User.objects.exclude(bitwise_or_function[Q(email__endswith=e) for e in emails_to_exclude]) 

就是這樣的。我不記得把整個列表按比例排列在一起的功能,我的Python很生疏。

0

您還可以在單​​個查詢中使用正則表達式執行此操作。

emails_to_exclude = ['@example.com', '@test.com', '@mailinator.com' ....] 
User.objects.exclude(email__regex = "|".join(emails_to_exclude)) 

我不知道這個查詢的效率。

這對SQLite不起作用,因爲它沒有內置的正則表達式支持。