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

Python 在Django中使用用户输入构造动态查询,python,django,django-orm,Python,Django,Django Orm,我有一个大模型,它存储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() . . .

我有一个大模型,它存储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_queryobj,我们可以在注释中获得queryset。现在,由于这个模型的性质,我不可能通过考虑过滤器、订单和排除的所有可能组合来手动完成这项工作


实现这一点的最佳和最安全的方法是什么?我唯一想到的是创建一个大字符串,然后使用exec或eval来执行该字符串。

使用字典进行筛选和排除,使用列表进行排序,您可以使用*或**进行参数解包


只要您不允许用户构造自己的参数,它应该是相当安全的。例如,筛选器事件\uuuu owner\uuuu password='hunter2'可用于间接查询相关模型中的字段。

对筛选器和排除项使用字典,对order\u by使用列表,并且可以使用带*或**的参数解包


只要您不允许用户构造自己的参数,它应该是相当安全的。例如,筛选器事件\uuuu owner\uuuu password='hunter2'可用于间接查询相关模型中的字段。

有一个非常好的包专门用于根据用户输入进行文件归档:


有一个很好的包专门用于基于用户输入的文件归档:

也许这能帮上忙也许这能帮上忙
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'])