2012-10-19 2 views
0

테이블이 messages으로 알려져 있습니다. 신청서에 다른 유형 개의 메시지를 보낼 수 있습니다. 이벤트 전달 등과 같이, 그 테이블에 열 typevalue이 있습니다.Django ORM 다른 테이블에 가입

내가 원하는 것은 특정 type에 대해 특정 테이블로 이동하여 value이 유효한지 확인하는 것입니다 (일반적으로이 테이블의 id에 매핑 됨). 여러 유형이있을 수 있으며 각 유형은 다른 테이블에 맵핑되어야합니다. 논리적으로 장고 ORM에 내장 된이 쓸 수있는 방법이 있나요? 지금 나는 오히려 내가 멀리 얻을 수 있습니다 않을 경우 바로 SQL을 사용하는 경우 난 단지 지금 ...

를이 가능한을보고 있어요 내가 좋아하는 뭔가를하고 있어요 :

Messages.objects.all().filter(Q(user_id=id))...etc 

위의 문에 type을 확인하고 특정 type을 확인하려면 관련 테이블을 확인하십시오.

답변

1

"다형성 연관"이있는 것 같습니다. Django에서 비슷한 일을하는 데는 두 가지 방법이 있지만, 내가 설명한 것과 가장 일치하는 것은 contenttypes 모듈입니다.이 모듈은 응용 프로그램에서와 같이 유형과 값에 별도의 열을 사용합니다.

+0

아니요. 그렇게 생각하지 마십시오. 내'type' 컬럼은 하나의 테이블이 아닌 몇 가지 타입의 테이블에 매핑 될 수 있기 때문에'value' 컬럼은'type'에 기반한 테이블을 사용해야 할 것입니다. – KVISH

+0

정확히 contenttypes에 대한 것과 같습니다. 다형성 연관은 하나의 사전 정의 된 테이블에서 행을 가리키는 대신 여러 테이블 중 하나에서 행을 가리킬 수있는 외래 키를 가지고있는 경우입니다. 내가 링크 한 문서의 "일반적인 관계"섹션을보십시오. –

+0

확실합니까? 더 궁금한 점이있어서 죄송합니다. 하지만'type'은 'E'이고'event' 테이블을 확인하고 싶습니다. 'M'이면'user' 테이블에서'value'를 확인하고 싶습니다 ... – KVISH

0

multi-table inheritance 구조 만 정의하면됩니다. 여러 유형의 메시지와 필드 상속이 있다는 점에서 동일한 결과를 얻지 만, type 필드를 전혀 사용하지 않아도됩니다. 게시물보기 처리기에서

class Message(models.Model): 
    value = models.CharField(max_length=9000) 

class Event(Message): 
    pass 

class Tweet(Message): 
    pass 

:

... 
if request.POST['type'] == 'event': 
    Event.objects.create(value=request.POST['value']) 
elif request.POST['type'] == 'tweet': 
    Tweet.objects.create(value=request.POST['value']) 
... 

그런 다음, 수의 오브젝트 : 구조의이 종류는 당신을 위해 작동하지 않는 경우

all_tweets = Tweet.objects.all() 
all_messages = Message.objects.all() 

for message in all_messages: 
    try: 
     event = message.event 
    except Event.DoesNotExist: 
     # this message is not an Event 
     pass 

은 두 가지 다른 스타일이있다 Django가 지원하는 모델 상속 : Abstract base classesProxy models. @AndrewGorcester에서 제안한대로 GenericForeignKey을 보유 할 수도 있습니다.

관련 문제