2

我有一个 django 模型,它可以通过外键(调用它们object1object2)具有与之相关的两个对象之一。其他两个类在功能上几乎相同,但包含的信息略有不同。在另一个 StackOverflow 问题的建议下,我正在使用 python 方法property()来设置和获取存在的任何对象。它如下所示:

class Master(models.Model):
    object1=models.ForeignKey(Object1, null=True)
    object2=models.ForeignKey(Object2, null=True)

    def get_object(self):
        if self.object2_id:
            return self.object2
        else:
            return self.object1

    def set_object(self, instance):
        if isinstance(instance, Object2):
            self.object2 = instance
            self.object1 = None
        else:
            self.object2 = None
            self.object1 = instance

    objectInstance = property(get_object, set_object)

这是该类的简化版本。我认为一切正常。我能够设置和获取信息,并且可以在objectInstance我的几个页面上显示保存的数据。我正在使用 django-tables2 在表格中显示信息,它也能够显示所有信息。但是,当我尝试对数据进行排序(使用提供的方便箭头)时,我得到一个 FieldError:

 FieldError at /workflow/list/request/
 Cannot resolve keyword u'objectInstance' into field. Choices are: object1, object2

知道是什么原因造成的吗?或者您需要查看哪些代码片段来帮助确定原因是什么?

编辑:

所以看起来我不是唯一一个遇到这个问题的人。这篇文章似乎表明这是 django-tables2 的问题。django-tables2 中的非查询集数据排序

似乎虽然表格可以显示保存在 a 中的信息,property但它无法对其进行排序。

4

2 回答 2

1

找到了答案。

问题是 django-tables2 不知道如何订购非查询集数据。这是通过显式地为表的每一列提供一个 order_by 参数来解决的。

文档在这里:http ://django-tables2.readthedocs.org/en/latest/#specifying-alternative-ordering-for-a-column

于 2013-06-20T18:53:46.940 回答
1

如果您想使用装饰器,请参阅此响应

但最好的方法是使用通用关系

编辑

也许是:

class Master(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    objectInstance = generic.GenericForeignKey('content_type', 'object_id')

所以,你可以这样做:

>>> t = Master(objectInstance=Object2())
>>> t.save()
>>> t.objectInstance
<Object2: a_description>
>>> t.objectInstance = Object1()
>>> t.save()
>>> t.objectInstance
<Object1: a_description>

希望这可以帮助!

于 2013-06-20T17:23:47.177 回答