在Django的tables2非查询集数据排序(Non-queryset data ordering

2019-06-25 11:48发布

该文件说:

在表格为通过模型的支持下,该数据库将处理顺序。 如果是这种情况并非如此,Python的CMP功能是用来和不同类型的比较时,下列机构被用作后备:...

但是,这可能在一个模型的支持下,在自定义列的表? 例如

class MyModel(models.Model):
    x = models.IntegerField()
    y = models.IntegerField()

    def z(self):
        return x+y

class MyTable(tables.Table):
    z = tables.Column()
    class Meta:
        model = MyModel

当我尝试这样的事情,该列显示OK,但是当我在列标题点击排序,我得到这个错误:

抓FieldError而渲染:无法解析的关键字u'z”到现场。 选项有:...

显然,这是因为Z不是在数据库表中找到。

有没有解决的办法?

Answer 1:

如果你在不具备的数据库列的属性排序您不能使用的查询集。 你可以通过一个列表,你的表虽然。

假设你的models.py如下:

from django.db import models

class MyModel(models.Model):
    def foo(self):
        return something_complex()

你可以有tables.py,看起来像这样:

import django_tables2 as tables
from .models import MyModel

class MyModelTable(tables.Table):
    foo = tables.Column()

    class Meta:
        model = MyModel

然后在您的views.py:

from django_tables2.config import RequestConfig
from django.core.paginator import InvalidPage
from django.shortcuts import render

def view_my_models(request):
    # use a list so django_tables2 sorts in memory
    my_models = list(MyModel.objects.all())

    my_models_table = MyModelTable(my_models)
    RequestConfig(request).configure(my_models_table)

    try:
        page_number = int(request.GET.get('page'))
    except (ValueError, TypeError):
        page_number = 1

    try:
        my_models_table.paginate(page=page_number, per_page=10)
    except InvalidPage:
        my_models_table.paginate(page=1, per_page=10)

    template_vars = {'table': my_models_table}
    return render(response, "view_my_models.html", template_vars)

还有一个公开售票讨论这个问题 。



文章来源: Non-queryset data ordering in django-tables2