Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-如何为不同的查询排序queryset?_Python_Django_Django Queryset - Fatal编程技术网

Python Django-如何为不同的查询排序queryset?

Python Django-如何为不同的查询排序queryset?,python,django,django-queryset,Python,Django,Django Queryset,我有一个问题,我想根据基于查询的计算值按降序排列queryset 查询:?水果=苹果&?水果=梨 在这种情况下: 苹果数+梨数+(苹果数*梨数) models.py class Costumer(BaseModel): name = models.CharField('name'), max_length=255, blank=True fruits = models.JsonField('fruit'), null=True, blank=True, defau

我有一个问题,我想根据基于查询的计算值按降序排列queryset

查询:?水果=苹果&?水果=梨

在这种情况下: 苹果数+梨数+(苹果数*梨数)

models.py

class Costumer(BaseModel):
        name = models.CharField('name'), max_length=255, blank=True
        fruits = models.JsonField('fruit'), null=True, blank=True, default=dict)
我的客户水果看起来像这样:

水果={名称:苹果,计数:10},{名称:梨,计数:4},{名称:樱桃,计数:1},{名称:鳄梨,计数:2}

views.py

def get_queryset(self):
        fruits = dict(self.request.GET).get('fruit', [])
        queryset = Costumers.objects.all()
        if fruits:
               queryset = sorted(queryset, reverse = True, key=lambda costumer: self.calculate_order(costumer, fruits))
        return queryset

def calculate_order(self, costumer, fruits):
        value_list = [fruit['count'] for fruit in costumer.fruits if fruit['name'] in fruits]
        return sum(value_list) + (reduce((lambda x, y: x*y), value_list)) if value_list else 0
这似乎是从我到目前为止测试的数据中正确排序的,但是这似乎不是最好的方法。 有没有更好的方法使用Django Queryset API对这些数据进行排序?因为它现在的排序方式有点耗时,因为我必须迭代数据库中的所有记录

编辑: 我有另一个水果模型没有问题

class Costumer(BaseModel): 
        name = models.CharField('name'),  max_length=255, blank=True
        fruits = models.ManytoManyField(Fruits, through='CostumerFruits')

class Fruits(BaseModel): 
        name = models.CharField('name'), max_length=255, blank=True 
        count = models.IntegerField('count'), null=True, blank=True 

如何使用这两个模型和计算值对客户信息进行排序?

如果建模是多对多关系,请不要使用
JsonField
。这会使查询更加困难,也降低了保证结构(和引用)完整性的效率。@WillemVanOnsem我编辑了这个问题,我有两个模型没有问题……如果建模是多对多关系,请不要使用
JsonField
。它使查询变得更加困难,也降低了保证结构(和引用)完整性的效率。@WillemVanOnsem我编辑了这个问题,我有两个模型没有问题。。。