3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
Python的參數(shù)擴(kuò)展可用于解決此問(wèn)題:
kwargs = {
'{0}__{1}'.format('name', 'startswith'): 'A',
'{0}__{1}'.format('name', 'endswith'): 'Z'
}
Person.objects.filter(**kwargs)
這是一個(gè)非常常見(jiàn)且有用的Python習(xí)慣用法。

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
一個(gè)簡(jiǎn)化的例子:
在Django調(diào)查應(yīng)用程序中,我想要一個(gè)顯示注冊(cè)用戶(hù)的HTML選擇列表。但是,因?yàn)槲覀冇?000個(gè)注冊(cè)用戶(hù),所以我需要一種基于查詢(xún)條件(例如僅完成某個(gè)研討會(huì)的人員)來(lái)過(guò)濾該列表的方法。為了使調(diào)查元素可重復(fù)使用,我需要?jiǎng)?chuàng)建調(diào)查問(wèn)題的人能夠?qū)⒛切l件附加到該問(wèn)題上(不想將查詢(xún)硬編碼到應(yīng)用程序中)。
我想出的解決方案不是100%用戶(hù)友好的(需要技術(shù)人員的幫助才能創(chuàng)建查詢(xún)),但確實(shí)可以解決問(wèn)題。創(chuàng)建問(wèn)題時(shí),編輯者可以在自定義字段中輸入字典,例如:
{'is_staff':True,'last_name__startswith':'A',}
該字符串存儲(chǔ)在數(shù)據(jù)庫(kù)中。在視圖代碼中,它以形式返回self.question.custom_query。該值是一個(gè)看起來(lái)像字典的字符串。我們使用eval()將其轉(zhuǎn)換為真實(shí)的字典,然后使用** kwargs將其填充到查詢(xún)集中:
kwargs = eval(self.question.custom_query)
user_list = User.objects.filter(**kwargs).order_by("last_name")

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