亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Django中,如何使用動態字段查找過濾QuerySet?

在Django中,如何使用動態字段查找過濾QuerySet?

慕尼黑8549860 2019-11-05 14:55:03
給定一堂課:from django.db import modelsclass Person(models.Model):    name = models.CharField(max_length=20)是否有可能(如果有的話)擁有一個基于動態參數進行過濾的QuerySet?例如: # Instead of: Person.objects.filter(name__startswith='B') # ... and: Person.objects.filter(name__endswith='B') # ... is there some way, given: filter_by = '{0}__{1}'.format('name', 'startswith') filter_value = 'B' # ... that you can run the equivalent of this? Person.objects.filter(filter_by=filter_value) # ... which will throw an exception, since `filter_by` is not # an attribute of `Person`.
查看完整描述

3 回答

?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

Python的參數擴展可用于解決此問題:


kwargs = {

    '{0}__{1}'.format('name', 'startswith'): 'A',

    '{0}__{1}'.format('name', 'endswith'): 'Z'

}


Person.objects.filter(**kwargs)

這是一個非常常見且有用的Python習慣用法。


查看完整回答
反對 回復 2019-11-05
?
萬千封印

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")   


查看完整回答
反對 回復 2019-11-05
?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

一個非常復雜的搜索表通常表明一個更簡單的模型正試圖挖掘出它的出路。


您究竟希望如何獲得列名和操作的值?您從哪里得到'name'an 的值'startswith'?


 filter_by = '%s__%s' % ('name', 'startswith')

“搜索”表格?您要-什么?-從名稱列表中選擇名稱?從操作列表中選擇操作?盡管開放式,但大多數人都覺得這令人困惑且難以使用。


有多少列具有此類過濾器?6嗎 12點?18歲?


一些?復雜的選擇列表沒有任何意義。一些字段和一些if語句是有意義的。

大量?您的模型聽起來不正確。聽起來“字段”實際上是另一個表(而不是列)中某一行的鍵。

特定的過濾器按鈕。等等...這就是Django管理員的工作方式。特定的過濾器變成按鈕。并且適用與上述相同的分析。一些過濾器很有意義。大量的過濾器通常意味著一種第一范式違規。


許多相似的字段通常意味著應該有更多的行和更少的字段。


查看完整回答
反對 回復 2019-11-05
  • 3 回答
  • 0 關注
  • 734 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號