我正在用django制作一个小字匹配游戏,我用一个单词(模型:refword)启动用户,然后输入他们认为下一个单词(模型:单词)的内容。
他们输入的单词将成为下一个等待单词的refword。
前:
问题: 用户在第二步提交“Tree”并转到步骤3后,我想显示其他用户输入的内容以及这些单词对的计数。
请参阅下面问题的所需结果部分。我一直很难在我的视图中获取查询以使我接近我想要的内容。
继续这个例子,让我们说用户得到“当我说绿色,你说 _ ”并在“树”中输入。
这会将refword:Green和word:Tree写入数据库。
示例数据库数据
refword word
------- -------
green grass
green grass
blue sky
blue diamond
green clover
green tree
green grass
blue sky
red sky
green party
red head
green day
green tree <--- what the user just typed in
所需的展示结果
以下是迄今为止所说的内容:
refword word qty
------- ------- ---
green grass 3
green tree 2
green clover 1
green day 1
green party 1
以下是我对创建此内容所需要的内容的理解。
过滤:显示重新定义“绿色”的不同结果
计算:计算并显示每个结果出现的时间总和。
排序: 按数量递减排序,因此最高数量位于顶部。 按字母顺序升序排序(A到Z)(例如:绿色三叶草,绿色日和绿色方都有1个结果,因此按字母升序排序将三叶草放在顶部。)
以下是
的一些代码剪辑models.py
class Word(models.Model):
word = models.CharField(max_length=200)
refword = models.CharField(max_length=200)
form.py
class WordForm(forms.Form):
word = forms.CharField(max_length=30)
views.py
我正在设置我的观点
def submitword(request):
if request.method == 'POST': # If the form has been submitted...
form = WordForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
word = form.cleaned_data['word']
referring_word = request.session["referring_word"] #setup the session
word_form_data = Word(word=word, refword=referring_word)
模板文件
<p>When I said {{ ref_word }} you said {% form.word.value %}</p>
<p>Here's what has been said so far:</p>
答案 0 :(得分:1)
您无法使用在线查询获取所需信息。
次优的方法是使用distinct('word')
然后计算每项工作。但它只适用于pgsql。
qs = Word.objects.filter(refword=referringword).distinct('word')
cnt_list = dict()
for w in qs:
cnt_list.update({w.word: Word.objects.filter(refword=w.refword, word=w.word).count()})
不使用distinct()
和第二组查询的其他方式是......
使用values()
获取所需对象的词典,并使用regroup
模板过滤器标记来显示单词及其计数。但在这种情况下,不能对字数进行排序。
#views
word_list = Word.objects.filter(refword=referringword).values('refword', 'word')
#pass this to template
#template
{% regroup word_list|dictsort:"word" by word as word_count %}
<ul>
{%for wl in word_count %}
<li> {{wl.grouper}} : {{wl.list|length}} </li>
{%endfor%}
</ul>