2016-03-19 4 views
1

私は再帰的関係を持っています。 を編集:「リビジョン」に「clone」という名前を変更した方が適切です。属性名の単語を置き換えて、そのリストに追加する方法

origin = models.ForeignKey('self', null=True, related_name="%(app_label)s_%(class)s_revision") 

Articleクラスのインスタンスをこのようなリスト(シェル内)に追加できます。

a.website_article_revision.add(a) 

このように、元の記事には、このリストに多くのリビジョンが追加されます。

しかし、記事の単語を文字列で動的に変更する機能が必要です。たぶん、文字列の書式に似た属性名の書式がありますか?

何かがそうです。代わりにsetattrを使用してオブジェクトリストを割り当てるので

setattr(a, "website_{0}_revision".format(name), a) 
x = getattr(a, "website_{0}_revision".format(name)) 
+0

てみましたか? 'setattr' /' getattr'コードは 'a'を二度使用していますが、実際に' a'を自分自身に追加している場合には完全に理解できません。 – Cfreak

+0

あなたは'a'(別名コピー)のクローンを作成します。また、削除が問題になる可能性があります。 – Back2Basics

+0

はい、私はしました。 "Articleオブジェクトは反復可能ではありません"というTypeError例外がスローされます –

答えて

0

、あなたは単にo2mフィールドATTR/RelatedManagerを取得するためにgetattrを使用し、それにオブジェクトを追加する.add()を呼び出すことができます。このような

何か作業をする必要があります:あなたはそれを

x = getattr(a, "website_{0}_revision".format(name)) 
x.add(a) 
+0

私はそれが** m2m **フィールドであるかどうかはわかりません、おそらく** o ** 2m(ForeignKey)ですか? –

+0

うん、そうです。私はそれを訂正した。 – v1k45

関連する問題