我正在尝试对Django 1.6数据集执行过滤,计数和排序

时间:2014-07-08 06:17:57

标签: django django-templates django-views

我正在用django制作一个小字匹配游戏,我用一个单词(模型:refword)启动用户,然后输入他们认为下一个单词(模型:单词)的内容。

他们输入的单词将成为下一个等待单词的refword。

前:

  1. 主页显示“当我说绿色时,你说 _ 。”
  2. 用户类型并提交“树”
  3. 然后下一页显示“当我说树时,你说 __ 。”
  4. 问题: 用户在第二步提交“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>
    

1 个答案:

答案 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>