【问题标题】:cannot filter by an added field in django无法按 django 中的添加字段过滤
【发布时间】:2014-09-04 14:20:12
【问题描述】:

我想按添加字段的“状态”进行过滤,但它不起作用:

serial_number_list = TestSerialNumber.objects.filter(test_pool = test_pool, status='rejected')

我收到此错误:

无法将关键字“状态”解析为字段。选项有:id、serial_number、test_pool、testresult、testrun

这是我的模型类:

class TestSerialNumber(models.Model):
    serial_number = models.ForeignKey("core.SerialNumber", on_delete=models.PROTECT)
    test_pool = models.ForeignKey("TestPool", blank=True, null=True)

    def __unicode__(self):
        return self.serial_number.serial_number

    def panel_code(self):
        return self.serial_number.panel.panel_code

    def status(self):
        try:
            test_result = self.testresult_set.latest('report')
        except TestResult.DoesNotExist:
            return 'unknown'
        else:
            return test_result.test_status.name

另外,当导出到 json 时,我只得到以下字段:serial_number 和 test_pool,只有 ids 而不是其余的。

提前致谢!

【问题讨论】:

标签: django


【解决方案1】:

如果你想这样做,你必须创建一个名为“status”的字段

STATUS_CHOICES = (
    (1, 'rejected'),
    (2, 'blabla'),
)

status = models.IntegerField(choices=STATUS_CHOICES)

【讨论】:

  • 我认为这不准确。代码中的status 来自外键关系中的最新项。虽然您可以在每次通过信号添加或更新相关的 TestResult 时开始跟踪非规范化字段,但自定义管理器或原始 sql 可能更可取。
  • 是的,我同意!这种情况只是对象通常不会更改并且仅用于过滤的示例...
【解决方案2】:

根据您提供的代码结构,status 不是字段而是方法。因此,如果您想获取对象的状态,您需要先将其过滤掉,然后您可以访问将返回该对象的 status 的方法。

serial_number_list = TestSerialNumber.objects.filter(test_pool = test_pool)
print serial_number_list[0].status # as filter return a list

这将为您提供该对象的状态。

当您尝试使用无效字段访问模型时会出现错误Cannot resolve keyword 'status' into field. Choices are:id, serial_number, test_pool, testresult, testrun,无效是指modeldatabase 中不存在的字段

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 2015-02-22
    • 1970-01-01
    • 2021-10-29
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多