gpt4 book ai didi

python - 使用 Property to duck type 两个模型

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:06 25 4
gpt4 key购买 nike

我有一个 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 的问题。 Non-queryset data ordering in django-tables2

虽然表格可以显示保存在 property 中的信息,但它在排序时遇到了麻烦。

最佳答案

如果您想使用装饰器,请参阅 this response .

但最好的方法是使用 Generic relations

编辑

也许是:

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>

希望这对您有所帮助!

关于python - 使用 Property to duck type 两个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17219281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com