2017-10-02 7 views
1

장고에서 포럼 스레드를 디자인하려고합니다. 사용자는 스레드를 게시하거나 스레드에 응답하거나 다른 스레드 응답에 응답 할 수 있습니다 (예 : Reddit 설명). 모든 게시물은 날짜와 저자와 같은 기본 정보를 공유하므로 추상적 인 Post 클래스를 만들 것이라고 생각했습니다. 모든 게시물들이 회신되는 parent 게시물을 가질 수 있기 때문에, 내 직감을 시도하고 추상 클래스에 정의했다 :Django Model - 자기 계발을위한 추상 클래스

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 개체는 기능적으로 하나의 낭비 관계를 갖기 때문에 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을 허용 할 수있는 다형성 '상위'관계를가집니다.