第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在Django中,如何使用動(dòng)態(tài)字段查找過(guò)濾QuerySet?

在Django中,如何使用動(dòng)態(tài)字段查找過(guò)濾QuerySet?

慕尼黑8549860 2019-11-05 14:55:03
給定一堂課:from django.db import modelsclass Person(models.Model):    name = models.CharField(max_length=20)是否有可能(如果有的話)擁有一個(gè)基于動(dòng)態(tài)參數(shù)進(jìn)行過(guò)濾的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貢獻(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í)慣用法。


查看完整回答
反對(duì) 回復(fù) 2019-11-05
?
萬(wàn)千封印

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


查看完整回答
反對(duì) 回復(fù) 2019-11-05
?
蝴蝶不菲

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)該有更多的行和更少的字段。


查看完整回答
反對(duì) 回復(fù) 2019-11-05
  • 3 回答
  • 0 關(guān)注
  • 731 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)