3

がある私のmodels.pyDjangoの汎用リレーションシップを介してリンクされたオブジェクトを取得し、その型を決定するにはどうすればよいですか?ここ

class Player(models.Model): 
    name = models.CharField(max_length=100) 
    #...fields... 
    comment = models.generic.GenericRelation(Comment) 

class Game(models.Model): 
    name = models.CharField(max_length=100) 
    #...other fields... 
    comment = models.generic.GenericRelation(Comment) 

class Comment(models.Model): 
    text = models.TextField() 
    content_type = ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey() 

私はこれを行うことができますコメントにプレーヤーやゲームから移動するには?また

text = PlayerInstance.comment.text 

、私は私が終わる場所を見つける方法がわからないコメント(モデル)

CommentInstance = get_object_or_404(Comment, pk=coment_id) 

そして、どのように(ゲームやプレーヤーにCommentInstanceポイントをCONTENT_TYPEたテストするを持ちます)それにどのように接続するのですか?

答えて

3

ジャンゴでの一般的な関係のためのドキュメントはここで見つけることができますhttps://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations

あなたがそうのようなcontent_objectにアクセスできるようにする必要があります

linked_object = CommentInstance.content_object 

あなたが知りたい場合はどのようなオブジェクトこの種のあなたは、typeisinstance、またはissubclassを使って、Pythonのオブジェクトと同様に質問することができます。私はあなたが呼ばれるCommentInstanceの属性のためにここに望んでいたと仮定あなたは、あなたが

if isinstance(linked_object, Player): 
    # Do player things 
elif isinstance(linked_object, Game): 
    # Do game things 
else: 
    # Remember it might be something else entirely! 

ような何かを行うことができ、それはプレーヤーやゲームであることに基づいて異なることをやってみたかったのであれば、この

linked_object_type = type(linked_object) 

をお試しくださいplayerまたはgameのようなものです。これらは存在しません - あなたはあなたが上に持っているものをあなたのmodels.pyで知っていなくても、それはこれらの2つのタイプのオブジェクトの1つであることは間違いありません。

PS models.pyファイルの内容を並べ替えて、他の2つの前にコメントを付けることができます。

関連する問題