我有一些记录,我想根据计算值排序.得到的答案在这里 ......像这样:
sorted(Profile.objects.all(), key=lambda p: p.reputation)
Run Code Online (Sandbox Code Playgroud)
在这样的Profile类上:
class Profile(models.Model):
...
@property
def reputation(self):
...
Run Code Online (Sandbox Code Playgroud)
不幸的是,通用视图需要一个queryset对象,如果我给它一个列表就会抛出错误.
有没有办法做到这一点返回一个查询集
要么...
我可以以某种方式将列表转换为查询集吗?在django docs中找不到类似的东西.
我希望不要对数据进行非规范化,但我想我会这样做.
似乎获取查询集的唯一方法是,如果您可以将所有逻辑都放入sql查询中.
如果那是不可能的,(我认为)你需要对数据进行非规范化
假设我有以下型号:
class Contest:
title = models.CharField( max_length = 200 )
description = models.TextField()
class Image:
title = models.CharField( max_length = 200 )
description = models.TextField()
contest = models.ForeignKey( Contest )
user = models.ForeignKey( User )
def score( self ):
return self.vote_set.all().aggregate( models.Sum( 'value' ) )[ 'value__sum' ]
class Vote:
value = models.SmallIntegerField()
user = models.ForeignKey( User )
image = models.ForeignKey( Image )
Run Code Online (Sandbox Code Playgroud)
站点的用户可以将他们的图像贡献给多个竞赛.然后其他用户可以向上或向下投票.
一切正常,但现在我想显示一个页面,用户可以看到对某个比赛的所有贡献.图像应按其分数排序.因此我尝试了以下方法:
Contest.objects.get( pk = id ).image_set.order_by( 'score' )
Run Code Online (Sandbox Code Playgroud)
因为我担心它不起作用,因为'score'没有可用于查询的数据库字段.
嘿我想根据django中的计算值对对象进行排序...我该怎么办?
以下是基于堆栈溢出的用户配置文件模型示例,解释了我的困境:
class Profile(models.Model):
user = models.ForeignKey(User)
def get_reputation():
...
return reputation
reputation = property(get_reputation)
Run Code Online (Sandbox Code Playgroud)
所以,说我想按声誉对用户进行排序.我怎么做?我知道你不能这样做:
Profile.objects.order_by("-reputation")
Run Code Online (Sandbox Code Playgroud)
谢谢大家的帮助 :)
我将 Django 对象设置为:
class Example(models.Model):
count = models.CharField(default="0")
Run Code Online (Sandbox Code Playgroud)
因此,如果我有一些对象ex1, ex2, ex3,ex4它们的计数分别为 -1、0、5、-6。我希望能够查询对象并将它们排序为[0, 5, -6, -1]任何零首先出现的顺序,然后是正数,然后是负数,同时每个部分也按升序排列。我正在考虑使用类似的东西,Example.objects.order_by('count')但没有找到一种方法来使用像这样的自定义函数来做到这一点。
我正在查看的另一条路线如下所示:
objs = Example.objects.all()
sorted_objs = sorted(objs, key = lambda o: int(o.count))
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 sorted 方法先对零进行排序?我无法找到一个。
我使用的最后一种方法是:
objs = Example.objects.all()
zero_objs = []
positive_objs = []
negative_objs = []
for obj in objs:
if obj.count == 0:
zero_objs.append(obj)
elif obj.count < 0:
negative_objs.append(obj)
else:
postitive_objs.append(obj)
sorted_objs = zero_objs + sorted(postitive_objs) + sorted(negative_objs) …Run Code Online (Sandbox Code Playgroud)