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

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

在 Django 中使用用戶輸入構(gòu)建動(dòng)態(tài)查詢

在 Django 中使用用戶輸入構(gòu)建動(dòng)態(tài)查詢

三國(guó)紛爭(zhēng) 2021-06-29 12:11:52
我有一個(gè)存儲(chǔ) 10 個(gè)基于文本的值和 10 個(gè)數(shù)值的大模型。像這樣的東西:class Dataset(models.Model):    text_field_1 = models.CharField(max_length=255)    .    .    .    text_field_10 = models.CharField(max_length=255)    number_field_1 = models.IntegerField()    .    .    .    number_field_10 = models.IntegerField()現(xiàn)在,我想要做的是通過將對(duì)象傳遞給視圖,為用戶提供一種使用這些字段過濾和排序數(shù)據(jù)集的方法。希望下面的示例顯示了我想要做的事情:obj = {    "filters" : [        "text_field_1='vaccines'",        "number_field_5__gte=1000",    ],    "order_by" : "text_field_3, -number_field_7",    "excludes" : [],}generate_query(obj) # Dataset.objects.filter(text_field_1='vaccines', number_field_5__gte=1000).order_by('text_field_3', '-number_field_7')因此,通過調(diào)用generate_query(obj),我們可以在評(píng)論中獲得查詢集?,F(xiàn)在,由于此模型的性質(zhì),我不可能通過考慮過濾器、訂單和排除的每種可能組合來手動(dòng)執(zhí)行此操作。實(shí)現(xiàn)這一點(diǎn)的最佳、最安全的方法是什么?我唯一想到的是創(chuàng)建一個(gè)大字符串,然后使用exec或eval執(zhí)行該字符串。
查看完整描述

2 回答

?
阿波羅的戰(zhàn)車

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊

將字典用于過濾器和排除,以及用于 order_by 的列表,您可以使用*或使用參數(shù)解包**。


obj = {

    "filters" : {

        "text_field_1": "vaccines",

        "number_field_5__gte": "1000",

    },

    "order_by" : ["text_field_3", "-number_field_7"],

    "excludes" : {},

}


Dataset.objects.filter(**obj['filters']).exclude(**obj['excludes']).order_by(*obj['order_by'])

只要您不允許用戶構(gòu)造自己的__參數(shù),它就應(yīng)該是非常安全的。例如,過濾器event__owner__password='hunter2'可用于間接查詢相關(guān)模型中的字段。


查看完整回答
反對(duì) 回復(fù) 2021-07-13
  • 2 回答
  • 0 關(guān)注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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