2011-01-25 10 views
1

내가 장고에 아주 새로운 오전이 문제에 당신의 도움 감사하겠습니다 :

내가 클릭, 투표 수와 같은 (메타 정보을 가진 테이블이를 , 댓글 ...) 내 웹 사이트의 다른 영역 (뉴스, 달력의 이벤트, 영화 ..). 테이블은 두 개의 기본 키 (fi = INTEGER 및 tbl = CHAR)로 참조됩니다.

class News(models.Model): 
    title = models.CharField() 
    ... 
class Film(models.Model): 
    title = models.Charfield() 
    ... 
class Calendar(models.Model): 
    title = models.Charfield() 
    ... 

class MetaInfo(models.Model): 
    fi = ForeignKey(??) # Integer 
    tbl = ForeignKey(??) # CharField 

예 : 파이 = 1 TBL = '뉴스'기본 키 (100) 엔트리를 필름에 관한 것이다 기본 키 (1)와 인터넷 = 100 TBL = '영화'와 뉴스 항목에 관한 것이다.

어떻게 구현합니까? 이것은 심지어 장고와 가능한가?

답변

1

장고에는 Generic Foreign Keys이라는 기본 제공 기능이있어 하나의 테이블을이 방식으로 여러 모델에 연결할 수 있습니다. 원하는 경우

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 

class News(models.Model): 
    title = models.CharField() 
    ... 
class Film(models.Model): 
    title = models.Charfield() 
    ... 
class Calendar(models.Model): 
    title = models.Charfield() 
    ... 

class MetaInfo(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 

    content_object = generic.GenericForeignKey() 

, 당신은 GenericRelation을 사용하여 모델과 메타 정보 사이의 관계에 대한 자세한 명시 될 수 있습니다

당신이 당신의 모델을 만들 것입니다 방법이다. 예를 들어, 콘텐츠 _ 메타 정보 모델에서

:

class Film(models.Model): 
    title = models.CharField() 
    metainfo = generic.GenericRelation('MetaInfo') 
    ... 

이것은 당신이

f = Film.objects.get(pk=1) 
for mi in f.metainfo.all(): 
    #mi is a matching MetaInfo record for Film record with pk=1 

그냥 조금 정교한에서와 같이, 필름 모델에서 직접 관련 메타 정보 기록에 액세스 할 수 있습니다 (Django는 ContentType이라는 Django 구조를 가리키고 있지만 Django는 앱/앱 세트의 각 모델에 대해 하나를 구성합니다.) object_id는 사용자의 fi 키에 해당합니다. 실제로 일반적으로 그 분야에 많은 관심을 기울이지 않습니다. 대신 해당 레코드 인 내용 개체를 가져오고 설정합니다. 예를 들어, tlb = 'Film', fi = 1을 저장하거나 검색하는 대신 pk = 1과 일치하는 Film 레코드에 직접 해당하는 content_object를 가져 오거나 설정할 수 있습니다. 본질적으로

, contenttype__name='Film', object_id=1

content_object=Film.object.get(pk=1) 동안 모든 장고 만 사용이 데이터베이스가 있다고 가정이다. 장고에서 사용하려고하는 기존 데이터베이스의 경우이를 처리 할 수있는 간단한 방법이 없습니다.