2015-11-30 111 views
0

我有一個像這樣設置的用戶模型。Django篩選器列表上的iexact

class ExternalUserModel(models.Model): 
    email = models.EmailField() 
    # other fields 

class MyUserModel(models.Model): 
    external_user = models.ForeignKey(ExternalUserModel) 
    # other fields 

而我試圖從電子郵件列表中獲取MyUserModel的列表。

這是我綁來執行查詢:

MyUserModel.objects.filter(external_user__email__iexact__in=user_emails) 

但我發現了這個錯誤: Unsupported lookup 'iexact' for EmailField or join on the field not permitted.

我需要iexact因爲電子郵件列表是基於用戶輸入和可能與存儲在數據庫中的外殼不匹配。

我應該如何去做這個查詢?

回答

2

Django的ORM不直接支持。我不認爲數據庫後端也做。您可以通過如在這裏不同的答案,結合多個__iexact過濾得到你要尋找的結果:How to dynamically compose an OR query filter in Django?

有所示的選項中,我更喜歡reduce(operator.or_, ...)語法在for循環,但是這是個人喜好。

+0

謝謝! 'query = reduce(operator.or_,(Q(external_user__email__iexact = x)for user_emails))' 'MyUserModel.objects.filter(query)' 訣竅! – Iceandele

-1

電子郵件必須完整,因此,它應該是確切的,您不需要使用__iexact查找。你只需要:

MyUserModel.objects.filter(external_user__email__in=user_emails) 
+0

這需要考慮的情況,即'電子郵件@ example.com'不同於'電子郵件@ example.com' – Jonathan