三國(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)模型中的字段。
添加回答
舉報(bào)
0/150
提交
取消