假设我有以下型号:
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'没有可用于查询的数据库字段.
假设我有一个像Bill这样的事情的查询集:
test=Things.objects.filter(user='Bill')
Run Code Online (Sandbox Code Playgroud)
现在我想按照分配给账单的日期对所有这些事情进行排序.不幸的是,赋值日期不是Thing模型中的字段.相反,有一个名为thing_date()的方法可以计算出来并返回日期.例如,以下内容:
Thingobject.thing_date()
Run Code Online (Sandbox Code Playgroud)
...返回日期.我想我想做的是:
test=Things.objects.filter(user='Bill').order_by(self__thing_date())
Run Code Online (Sandbox Code Playgroud)
......但我知道那是行不通的.还有另外一种方法吗?
毫不奇怪,其他人以前一直沿着这条路走下去.链接
当我做的事情
一世. objects = Model.objects.all()
然后
II. objects.filter(field_1=some_condition)
我每次在第2步都遇到各种条件时都会点击db.有没有办法在第一个操作中获取所有数据然后只是处理结果?
嘿我想根据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 通用视图 (ListView),我想添加选项来通过它的方法对对象进行排序,这些方法有点复杂,并且可能难以使用extra(). 我意识到做到这一点的唯一方法是使用以下内容对 Queryset 进行排序():
sorted(queryset, key=lambda q: q.choice_entropy())
Run Code Online (Sandbox Code Playgroud)
但是,要将其合并到 ListView 中,并允许用户选择排序条件,我需要这样的东西
class IndexView(ListView):
model = Question
def get_queryset(self):
queryset = super(IndexView, self).get_queryset()
if 'order_by' in self.request.GET:
if self.request.GET['order_by'] == 'entropy':
return sorted(queryset, key=lambda q: q.choice_entropy())
elif self.request.GET['order_by'] == 'newest':
return queryset.order_by('-published_time')
elif self.request.GET['order_by'] == ... (some other sorting criterion)
return queryset
Run Code Online (Sandbox Code Playgroud)
这里的问题(大概)是sorted(queryset, key=lambda q: q.choice_entropy())return a <type 'list'>whilequeryset的类型是<class 'django.db.models.query.QuerySet'>。
我不认为这会是一个问题,因为self.queryset实际上可以是任何可迭代的项目,而不仅仅是一个查询集。但 ListView 似乎不喜欢这个,我只是得到A server error …
我有一个 Django 应用程序,可以将查询集呈现到表中。
我需要对底层查询集进行一些修改,最方便的方法是将查询集转换为数据帧,在那里做一些魔法,然后将结果数据帧转换回查询集,以便我可以将其输入到现有的渲染中。
将查询集转换为数据帧似乎很简单,但我找不到将其转换回来的方法。
tables.py
class StuffTable(tables.Table):
class Meta:
model = Stuff
template_name = 'django_tables2/semantic.html'
views.py
import django_pandas.io as dpd
from django_tables2.tables import Table
from .models import Stuff
from .tables import StuffTable
def index(request):
context = dict()
template = 'gui/index.html'
stuff = Stuff.objects.all()
# do pandas stuff with the data
df = dpd.read_frame(stuff)
df = ...
modified_stuff = convert_df_back_to_qs(df) # how to do this?
table = StuffTable(modified_stuff)
context['table'] = table
return render(request, template, context)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
编辑:我想转换回来的原因是 html 文件看起来像
{% …Run Code Online (Sandbox Code Playgroud) 假设我有一个模型My_model,并且有该模型的 id 列表;
my_ids = [3,2,1,42]
Run Code Online (Sandbox Code Playgroud)
现在我想获得一个带有My_model.objectsid 的 QuerySet。我已经找到了这个解决方案,但它对我不起作用,因为我希望 QuerySet 中的对象与my_ids.
如何在 Django 和 Python 中转换 QuerySet 中的 id 列表?