zoukankan      html  css  js  c++  java
  • Django使用Case手动控制排序

    手动控制排序使用Django update方法,所有涉及的数据每一条都会执行一次SQL update语句,MySQL有case语句可将所有影响的数据进行一次性更改,查看Django文档支持case语句

    https://docs.djangoproject.com/en/2.2/ref/models/conditional-expressions/

    >>> a_month_ago = date.today() - timedelta(days=30)
    >>> a_year_ago = date.today() - timedelta(days=365)
    >>> # Update the account_type for each Client from the registration date
    >>> Client.objects.update(
    ...     account_type=Case(
    ...         When(registered_on__lte=a_year_ago,
    ...              then=Value(Client.PLATINUM)),
    ...         When(registered_on__lte=a_month_ago,
    ...              then=Value(Client.GOLD)),
    ...         default=Value(Client.REGULAR)
    ...     ),
    ... )
    >>> Client.objects.values_list('name', 'account_type')
    <QuerySet [('Jane Doe', 'G'), ('James Smith', 'R'), ('Jack Black', 'P')]>

    根据示例编写自己的应用

    增加新数据:

    max_sort = Kol.objects.filter(channel_type_kol=kol_type).order_by('sort').last().sort
    if sort > max_sort:
        dif_value = max_sort + 1
    elif 0 < sort < max_sort + 1:
        Kol.objects.filter(channel_type_kol=kol_type).update(

            sort=Case(

                When(sort__gte=sort,

                     then=F('sort') + 1),

                default=F('sort')
            )
        )
        dif_value = sort

    更改排序:

    max_sort = Kol.objects.filter(channel_type_kol=channel_type).order_by('sort').last().sort
    if 0 < new_sort < kol_info.sort:
        Kol.objects.filter(channel_type_kol=channel_type).update(

            sort=Case(

                When(sort__range=[new_sort, kol_info.sort - 1],

                     then=F('sort') + 1),

                default=F('sort')
            )
        )
        kol_info.sort = new_sort
        kol_info.save()

    elif kol_info.sort < new_sort < max_sort + 1:
        Kol.objects.filter(channel_type_kol=channel_type).update(

            sort=Case(

                When(sort__range=[kol_info.sort + 1, new_sort],

                     then=F('sort') - 1),

                default=F('sort')
            )
        )
        kol_info.sort = new_sort
        kol_info.save()

    删除一条数据:

    info = Kol.objects.get(id=id)
    Kol.objects.filter(channel_type_kol=info.channel_type_kol).update(

        sort=Case(

            When(sort__gt=info.sort,

                 then=F('sort') - 1),

            default=F('sort')
        )
    )
    info.delete()

  • 相关阅读:
    静态和伪静态
    数据库优化
    C#数组的排序(正序逆序)
    C# for和 foreach 的数组遍历 比较
    Python识别璇玑图中诗的数量
    Linux环境下配置matplotlib库使用中文绘图
    manjaro配置记录
    ubuntu环境下测试cache大小并校验
    ubuntu 单机配置hadoop
    cachestat 安装文档
  • 原文地址:https://www.cnblogs.com/ykugb/p/11454569.html
Copyright © 2011-2022 走看看