3 回答

TA貢獻1871條經驗 獲得超8個贊
Python的參數擴展可用于解決此問題:
kwargs = {
'{0}__{1}'.format('name', 'startswith'): 'A',
'{0}__{1}'.format('name', 'endswith'): 'Z'
}
Person.objects.filter(**kwargs)
這是一個非常常見且有用的Python習慣用法。

TA貢獻1891條經驗 獲得超3個贊
一個簡化的例子:
在Django調查應用程序中,我想要一個顯示注冊用戶的HTML選擇列表。但是,因為我們有5000個注冊用戶,所以我需要一種基于查詢條件(例如僅完成某個研討會的人員)來過濾該列表的方法。為了使調查元素可重復使用,我需要創建調查問題的人能夠將那些條件附加到該問題上(不想將查詢硬編碼到應用程序中)。
我想出的解決方案不是100%用戶友好的(需要技術人員的幫助才能創建查詢),但確實可以解決問題。創建問題時,編輯者可以在自定義字段中輸入字典,例如:
{'is_staff':True,'last_name__startswith':'A',}
該字符串存儲在數據庫中。在視圖代碼中,它以形式返回self.question.custom_query。該值是一個看起來像字典的字符串。我們使用eval()將其轉換為真實的字典,然后使用** kwargs將其填充到查詢集中:
kwargs = eval(self.question.custom_query)
user_list = User.objects.filter(**kwargs).order_by("last_name")

TA貢獻1810條經驗 獲得超4個贊
一個非常復雜的搜索表通常表明一個更簡單的模型正試圖挖掘出它的出路。
您究竟希望如何獲得列名和操作的值?您從哪里得到'name'an 的值'startswith'?
filter_by = '%s__%s' % ('name', 'startswith')
“搜索”表格?您要-什么?-從名稱列表中選擇名稱?從操作列表中選擇操作?盡管開放式,但大多數人都覺得這令人困惑且難以使用。
有多少列具有此類過濾器?6嗎 12點?18歲?
一些?復雜的選擇列表沒有任何意義。一些字段和一些if語句是有意義的。
大量?您的模型聽起來不正確。聽起來“字段”實際上是另一個表(而不是列)中某一行的鍵。
特定的過濾器按鈕。等等...這就是Django管理員的工作方式。特定的過濾器變成按鈕。并且適用與上述相同的分析。一些過濾器很有意義。大量的過濾器通常意味著一種第一范式違規。
許多相似的字段通常意味著應該有更多的行和更少的字段。
添加回答
舉報