说我想要一个项目,和待办事项一对多,并且想随意重新排序待办事项?

过去,我添加了一个编号的订单字段,当有人想要更改订单时,必须使用新订单号更新所有项目。这可能是最糟糕的方法,因为它不是原子的并且需要多次更新。

我注意到 Django 有一个多值 CommaSeparatedIntegerField,它可以通过将有序键存储在项目表的一个字段中的待办事项表中的项目来包含订单。

我考虑了一个杜威十进制系统,如果我想拿第 3 项并将其放在 1 和 2 之间,我会将它的订单号更改为 1.5。

有些东西告诉我有一个更简单的选择,但我错过了......

您将如何为一对多关系下订单?

最佳答案

我讨厌这个问题......而且我一直遇到它。

对于我最近的 Django 站点,我们有一个包含 N 篇文章的时事通讯,当然,顺序很重要。我将默认顺序指定为升序 Article.id,但如果以“正确”顺序以外的其他方式输入文章,则会失败。

在 Newsletter change_form.html 页面上,我使用 Interface 插件 (http://interface.eyecon.ro/) 添加了一些 jQuery 魔法。我显示相关文章的标题,用户可以随意拖动它们。有一个 onChange 处理程序可以重新计算 article_order 字段中的 Article.id。

享受,
彼得

对于app=content,model=Newsletter,下面是
模板/管理员/内容/时事通讯/change_form.html

{% extends 'admin/change_form.html' %}

{% block form_top %}{% endblock %}
{% block extrahead %}{{ block.super }}
<script type="text/javascript" src="/media/js/jquery.js"></script>
<script type="text/javascript" src="/media/js/interface.js"></script>
<script>
$(document).ready(
    function () {
        $('ol.articles').Sortable(
            {
                accept :        'sortableitem',
                helperclass :   'sorthelper',
                activeclass :   'sortableactive',
                hoverclass :    'sortablehover',
                opacity:        0.8,
                fx:             200,
                axis:           'vertically',
                opacity:        0.4,
                revert:         true,
                trim:           'art_',
                onchange:
                    function(list){
                        var arts = list[0].o[list[0].id];
                        var vals = new Array();
                        var a;
                        for (a in arts) {
                            vals[a] = arts[a].replace(/article./, '');
                        }
                        $('#id_article_order').attr('value', vals.join(','));
                    }
            });
    }
);
</script>
{% endblock %}

{% block after_related_objects %}
{% if original.articles %}
<style>
.sortableitem {
    cursor:move;
    width: 300px;
    list-style-type: none;
    }
</style>

<h4>Associated Articles</h4>
<ol class="articles" id="article_list">
{% for art in original.articles %}
    <li id="article.{{art.id}}" class="sortableitem">{{art.title}}</li>

{% endfor %}
</ol>
{% endif %}
{% endblock %}

关于sql - 在 SQL 或 Django ORM 中,订购一对多的常规方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/370340/

10-13 00:49