我试图在django1.9中构建一个模型,该模型具有一个键、值对(dictionary)字段,该字段还允许查询集聚合(min、mix等)。 我尝试过使用JSONField:
#models.py
from django.contrib.postgres import fields as pgfields
class Entry(models.Model):
pass
class Scorer(models.Model):
name = models.CharField(max_length=100)
class EntryScoreSet(models.Model):
scorer = models.ForeignKey(Scorer)
entry = models.ForeignKey(Entry, related_name="scorecard")
scores = pgfields.JSONField(default={})
....
# shell test
import random
entry = Entry()
scorer,_ = Scorer.objects.get_or_create(name="scorer1")
entry.save()
for i in range(0,10):
scores = dict(scoreA=random.random(),
scoreB=random.random(),
scoreC=random.random(),
)
entry_score_set=EntryScoreSet(scores=scores, entry=entry, scorer=scorer)
entry_score_set.save()
entry.scorecard.filter(scorer="scorer1").aggregate(Max("scores__scoreA"))
但是我遇到了来自this ticket的错误(基本上,不支持聚合)。在
第二种选择是使用键、值对模型(类似于this answer):
^{pr2}$但我不知道如何在查询集中为特定的键值获取聚合。在
我该如何在Django中实现一个键、值对字段,该字段允许对特定键的值的查询集进行聚合?在
编辑:
下面是一个片段,它演示了我想使用pandas和第二个选项(key,pair model)执行的操作:
import django_pandas.io as djpdio
scds=Scorecard.objects.filter(
entry__in=Entry.objects.order_by('?')[:10],
scorer__name="scorer1")
scorecard_base=djpdio.read_frame(scds,fieldnames=["id","entry__id","scorer__name","scores__id"])
scores=djpdio.read_frame(Score.objects.filter(scorecard__in=scds),fieldnames=["id","key","value"])
scorecard_=(scorecard_base
.merge(scores,left_on="scores__id",right_on="id")
.pivot_table(index="entry__id",columns="key",values="value").reset_index())
scorecard=scorecard_base.merge(scorecard_,on="entry__id")
scorecard["scoreA"].max()
使用django的ORM是否可以实现这种情况?与使用pandas pivot函数相比,效率如何?在
您可以使用conditional expressions,使用您提出的第二个模型结构(}的外键)。在
Score
和一个{这将向结果的}提供最大值。类似地,}等
max_score_key1
对象添加一个max_score_key1
属性,这为所有Scores
的key
的{max_score_key2
用于Scores
,与{编辑:根据注释中的对话,您似乎希望在整个查询集中获得
^{pr2}$Score
中每个键的最大值。你可以这样做:这将为您提供如下输出:
相关问题 更多 >
编程相关推荐