为了账号安全,请及时绑定邮箱和手机立即绑定

在 Django 中使用用户输入构建动态查询

在 Django 中使用用户输入构建动态查询

三国纷争 2021-06-29 12:11:52
我有一个存储 10 个基于文本的值和 10 个数值的大模型。像这样的东西: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()现在,我想要做的是通过将对象传递给视图,为用户提供一种使用这些字段过滤和排序数据集的方法。希望下面的示例显示了我想要做的事情: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')因此,通过调用generate_query(obj),我们可以在评论中获得查询集。现在,由于此模型的性质,我不可能通过考虑过滤器、订单和排除的每种可能组合来手动执行此操作。实现这一点的最佳、最安全的方法是什么?我唯一想到的是创建一个大字符串,然后使用exec或eval执行该字符串。
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

将字典用于过滤器和排除,以及用于 order_by 的列表,您可以使用*或使用参数解包**。


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'])

只要您不允许用户构造自己的__参数,它就应该是非常安全的。例如,过滤器event__owner__password='hunter2'可用于间接查询相关模型中的字段。


查看完整回答
反对 回复 2021-07-13
  • 2 回答
  • 0 关注
  • 183 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号