2017-01-30 9 views
0

は、これが私のviews.pyに私のmodels.pyDjangoは、どのように私はこれを行う

class UserWidget(models.Model): 
    user = models.ForeignKey(User, related_name="widgets") 
    widget = models.ForeignKey(Widget) 
    options = JSONField(default="{}") 
    category = models.ManyToManyField(WidgetUserCategory) 

class UserWidgetAtomic(UserWidget): 
    atomic = models.ForeignKey(Atomic) 

class UserWidgetNonAtomic(UserWidget): 
    nonatomic = models.ForeignKey(NonAtomic) 

です(可能な場合)、子供のクラスの正確な型を知っていますそれは問題ではありません)

widgets = user.widgets.all() 

可能であれば、サブクラス化されたオブジェクトの型を反復しながら知りたいと思います。例えば

for item in widgets: 
    if item.__class__.__name__ == "UserWidgetAtomic": 
     do this 
    elif item.__class__.__name__ == "UserWidgetNonAtomic": 
     do that 

これは可能ですか?どうやって?

+0

if isinstinstance(item、UserWidgetAtomic):...のようなものhttps://docs.python.org/2/library/functions.html#isinstance – allcaps

+0

はい、これは動作しません。 isinstance(item、UserWidget)は私にTrueを与えますが、isinstance(item、UserWidgetAtomic)は私に偽を返します – xpanta

+0

あなたはテーブル構造が過度に複雑だと思います。 'UserWidget'は中間のmany2manyモデルとして使われるべきです。あなたの質問に 'Atomic'と' NonAtomic'モデルを追加できますか? 'category'も' UserWidget'モデルでは間違っているようです。数多くの関係がありますので、名前は 'categories'でなければなりません。 – trixn

答えて

0

これを行う必要があるのは、不適切なテーブル構造の結果である可能性があります。

私の最初の印象は、UserWidgetは、UserWidgetの間の関係です。これの明白な兆候は、両方に外部キーがあることです。そのモデルをitermediate many2many modelと定義する方がよいでしょう。

また、categoryのフィールドは間違っているようです。数多くの関係があるので、それは常にcategoriesのような名前でなければなりません。 おそらくWidgetモデルの外来キーです。その後、categoryが理にかなっています。

また、UserWidgetの2つのサブクラスを作成しました。これはそれらを扱う際にいくつかの困難をもたらす。すべてのユーザーウィジェットのタイプがUserWidgetAtomicまたはUserWidgetNonAtomicの場合は、UserWidgetモデルの抽象化を行う必要があります。 multi-table-inheritanceがあなたのケースで本当に必然であるかどうかを再確認する必要があります。なぜなら、事態がはるかに複雑になる可能性があるからです。

関連する問題