2017-10-02 9 views
1

私はDjangoでフォーラムスレッドを設計しようとしています。ユーザーはスレッドを投稿したり、スレッドに返信したり、他のスレッドの返信に返信することができます(Redditコメントのように)。すべての投稿は日付と著者のような基本情報を共有しているので、私は抽象的にPostクラスを作ると思っていました。すべての記事は、彼らがに返信されparentポストを持つことができるので、私の直感は試してみて、抽象クラスでそれを定義することでした:Djangoモデル - 自己の関係を持つ抽象クラス

class Post(models.Model): 
    content = models.TextField(max_length=1000) 
    parent = models.ForeignKey('self', null=True) 
    createdBy = models.ForeignKey(User) 
    class Meta: 
     abstract = True 

class Thread(Post): 
    title = models.CharField(max_length=200) 

class ThreadReply(Post): 
    score = models.IntegerField(default=0) 

しかし、結果は、子クラスは、同じの親を持つことができるということですタイプThreadReplyは実際にThreadの親またはThreadReplyの親を持つことができます。

class Post(models.Model): 
    content = models.TextField(max_length=1000) 
    createdBy = models.ForeignKey(User) 
    class Meta: 
     abstract = True 

class Thread(Post): 
    title = models.CharField(max_length=200) 

class ThreadReply(Post): 
    score = models.IntegerField(default=0) 
    parentThread = models.ForeignKey(Thread,null=True) 
    parentReply = models.ForeignKey(ThreadReply,null=True) 

しかし、それは感じていない...オブジェクト指向の十分な:私はThreadReplyの両方の関係を定義した場合 一つの解決策はありますか?すべてのThreadReplyオブジェクトは1つの無駄な関係を持ちますが、機能的にはThreadまたはThreadReplyに返信する必要があるだけなので、気になります。

+2

[generic relations](https://docs.djangoproject.com/en/1.11/ref/contrib/contenttypes/#generic-relations)をご覧ください – dahrens

+0

一般的な関係は、ありがたくありがとうございます。私は私の一般的な関係の解決策と私はそれを働かせてポストを更新します。 – stackPusher

答えて

0

Dahrensのコメントのおかげで、私はGeneric Relationsを調べ、必要なものを見つけました。

from django.contrib.contenttypes.fields import GenericForeignKey,GenericRelation 
from django.contrib.contenttypes.models import ContentType 

class Post(models.Model): 
    content = models.TextField(max_length=1000) 
    createdBy = models.ForeignKey(User) 
    score = models.IntegerField(default=0) 
    content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE,null=True) 
    object_id = models.PositiveIntegerField(null=True) 
    parent = GenericForeignKey(content_type,object_id) 
    replies = GenericRelation('Post') 

class Thread(Post): 
    title = models.CharField(max_length=200) 

今後は、スレッドの返信や自身がそれを拡張したスレッドのために使用されている:それは、親クラスはもはや抽象的であるように、継承を変更関与しました。 PostはThreadまたはPostを受け入れることができる多相の親関係を持っています。

関連する問題