【问题标题】:Page Refresh Disrupts Sort Order. Server Restart Restores It页面刷新会打乱排序顺序。服务器重启恢复它
【发布时间】:2014-06-04 01:55:26
【问题描述】:

我有一个排序的 QuerySet 我通过 dict 传递给模板。我需要通过 dict 维护 QuerySet 排序顺序以动态填充表。

我正在尝试通过This Answer 建议的嵌套列表来解决此问题。我已将此解决方案附加到This Suggestion

在 Apache2 重新启动后 - 表的第一次加载具有正确的排序。一旦我单击刷新,排序就会中断。我可以多次单击刷新并最终恢复排序,但是... 再次重新启动 Apache 会将排序顺序重置为预期。

有人可以帮助我吗?谢谢。

更新:

请注意finished_case 是外键。 finished_case 还继承了 Meta 类属性 ordering = ['name']。但我也明确地.order_by('finished_case__name')

views.url:

def caseindex(request):
    qtylist = caseStockOnHand(request)
    srtd = sorted(qtylist.items(), key=lambda item: item[0])
    context = {'qtyonhand':srtd}
    return render(request,'box_inv/caseindex.html', context)

methods.url:

def caseStockOnHand(request):
    s = stocktake.objects.filter(stocktake_type__name='Case').latest('date')
    c = caselog.objects.filter(date__gte=s.date)
    sd = stocktake_detail_case.objects.filter(stocktake=s).order_by('finished_case__name')

    qtylist = {}
    #Get Stocktake Qty
    for x in sd:
        qtylist[x.finished_case] = x.qty
    return qtylist

template.html

{% for x, y in qtyonhand %}
        {% if y > 0 %}
        <tr class = {% cycle 'row1' 'row2' %}>
            <td>{{x}}</td>
            <td>{{y}}</td>
        </tr>
        {% endif %}
{% endfor %}

另外,我在 Debian Wheezy 7.5 上使用带有 mod_wsgi 的 django 1.5、python 2.7、mysql 5.5 和 Apache 2.2。

【问题讨论】:

  • 您能否展示您实际所做的事情,而不是链接到两个答案

标签: python django sorting


【解决方案1】:

您的示例显然不代表您的代码,因为您使用字符串作为字典键,然后在您的代码中说它们不是字符串,而是查询集。试图在没有真实代码的情况下回答:您使用查询集作为字典键,并且它们的哈希值(可能从它们的内存地址生成)被用于对最终列表进行排序。查询集没有有意义的排序,因此每次重新加载后您可能会看到不同的结果。相反,您需要使用查询集内容进行排序。

编辑:替换

qtylist[x.finished_case] = x.qty

与:

qtylist[x.finished_case.name] = x.qty

以前的键是finished_case 对象,它们没有有意义的顺序。后者是字符串,有你想要的顺序。

替代方案:同时删除 dict 和 sort。代码变为:

qtylist = []
for x in sd:
    qtylist.append((x.finished_case.name, x.qty))
return qtylist

【讨论】:

  • 感谢您的意见!查询集通过order_by() 传递。据我了解,他们正在失去订单,因为 dict 类型是无序的。所以当我遍历dict 时,它会随机获取 ket 值吗?这是我的理解。很乐意接受被证明是错误的:P 此外,在'models.py 中,我正在使用Meta 子类和ordering
  • 是的,它们正在失去顺序,因为 dict 类型是无序的。此外,它们在排序操作后不会恢复顺序,因为您没有按名称对它们进行排序,而是按没有有意义的排序的 finished_case 对象对它们进行排序。响应已根据您更新的代码进行了扩展。
  • 优秀。我似乎欺骗了自己。由于调用__unicode__(self) 返回self.name,我忘记了实际上x.finished_case 是一个对象而不是字符串。但是......你能详细说明this。这似乎表明即使在调用对象列表时查询集也应该遵守排序。
  • 查询集遵循排序,即结果列表是有序的。 order_by() 也一样。您可以在上面的循环中验证此打印 x。这就是我在上面发送的替代实现有效的原因: qtylist 在循环末尾排序。原始代码中的排序被破坏,首先,在插入字典时(按对象 hash() 值排序,而不是 name 属性),其次,在使用 sorted() 函数时(按 id() 值排序,而不是名称属性)。那么,最好的解决方案就是不要一开始就破坏原来的顺序。
猜你喜欢
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多