2

外部キーを介してそれに関連する2つのオブジェクトの1つを持つことができるdjangoモデルがあります(それらobject1を and と呼びますobject2)。他の 2 つのクラスは、機能的にはほぼ同じですが、含まれる情報がわずかに異なります。別の 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 でのクエリセット以外のデータの順序付け

テーブルに保持されている情報を表示できますが、property並べ替えに問題があるようです。

4

2 に答える 2

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 に答える