无法按型号属性(访问者集)对表进行排序

时间:2016-12-06 19:37:55

标签: python django python-2.7 django-models django-tables2

我无法通过它的模型属性对表格进行排序。我知道我应该在列中设置访问者,以便<iframe src="http://www.w3schools.com/html"></iframe> 知道要处理哪个字段,但它不起作用。

这是表格:

django-tables2

这是扫描模型:

class ScansTable(tables.Table):
    site = tables.columns.Column(accessor='occurence.site', verbose_name='Site')
    url = tables.columns.TemplateColumn("""<a href="{{ record.occurence.url }}">{{ record.occurence.url|truncatechars:20 }}</a>""",
                                        accessor='occurence.url', verbose_name='Url')
    price = tables.columns.TemplateColumn(u"""{{ record.price }} €""")
    date = tables.columns.Column(accessor='date',order_by='date')
    time = tables.columns.Column(accessor='time',order_by='time')
    class Meta:
        model = Scan
        fields = ('date', 'time', 'site', 'url', 'valid', 'price')
        attrs = {'id': 'cans_table',
                 'class': 'table',}

观点:

class Scan(models.Model):
    occurence = models.ForeignKey('Occurence', related_name='scans')
    datetime = models.DateTimeField()
    price = models.DecimalField(max_digits=20,decimal_places=2,null=True,blank=True,verbose_name='Price')
    valid = models.BooleanField(default=True,verbose_name='Valid')

    def __unicode__(self):
        return u'{} {} {} {}'.format(self.occurence, self.datetime, self.price, u'OK' if self.valid else 'NOK')


    @property
    def date(self):
        return self.datetime.date()

    @property
    def time(self):
        return self.datetime.time()

当我不想对表格进行排序时,表格正在正确呈现。当我点击时间(例如)时,它会返回:

  

无法解析关键字u&#39; time&#39;进入田野。选择是:datetime,   groups,id,occurence,occurence_id,price,valid

你知道问题出在哪里吗?

2 个答案:

答案 0 :(得分:0)

奇怪的是什么类型的产品?你展示了Occurence模型以及它在视图中的价值

答案 1 :(得分:0)

似乎模型的已定义属性/方法不可用于查询集内的排序/过滤。我不完全理解为什么会这样。解决方案是不要将datetime定义为Scan模型上的属性,而是将它们注释到用于填充数据的查询集。

from django.db import models

def scans(request):
    ...
    scans = Scan.objects.filter(occurence__product=product).annotate(
        date=models.F('datetime__date'),
        time=models.F('datetime__time')
    )
    ...

请参阅有关字段查找的文档here。此外,您可以对这些字段使用tables特定列 - 请注意,现在结果已经在查询集中,您无需定义访问者:

class ScansTable(tables.Table):
    ...
    date = tables.DateColumn()
    time = tables.TimeColumn()
    ...