2011-08-23 4 views
0

설명하기 어려울 수 있습니다. 나는 장고와 모델의 전체 아이디어에 조금 새로운 사람이다.django에서 이상한 모델을 설정 하시겠습니까?

내가 각 기사에 작성자가 있지만 다른 사용자가 마음대로 기사를 수정할 수있는 기사 앱을 만들고 있다고 가정 해 보겠습니다. 이 모델을 만드는 방법에 대해 조금 어려움을 겪고 있습니다.

첫째, 나는 다음과 같이 사용자 프로필을 확장 : 여기

class UserProfile(models.Model): 
    #Required field: 
    user = models.OneToOneField(User) 

    #Other Fields: 
    headline = models.CharField() 
    industry = models.CharField() 
    article= models.ForeignKey(articleModel.article) 

혼란지고 난 처음이다, 나는 사용자 모델에 외래 키 필드를 배치해야합니까? 각 기사가 많은 편집자를 가질 수 있기 때문에 여기에 배치되는 것에 대한 나의 논리가 있습니다.

지금 여기 내 문서 모델 : 모든 문서는 하나의 창조자를 가지고 있기 때문에, 다시 제작자에 관련된 것, 그래서 여기 이상

class article(models.Model): 
    #primary key is already true 
    creator = models.ForeignKey(userModel.UserProfile) 
    title = models.CharField() 
    text = models.TextField() 

, 나는 외래 키 필드를 넣어. (부수적으로, 기사가 여러 작성자를 가질 수 있도록 만들고 싶지만이 시나리오에서 무엇을해야할지 모르겠다.) UserProfile 모델이 기사 모델을 참조하고 기사가이를 다시 참조하고 있다는 사실이 다소 이상해합니다. 누군가 내 뇌를 얽매이지 않게 도울 수 있습니까?

감사합니다. :)

답변

1

으로 간단한 (이것은 당신의 USERPROFILE 클래스의 문서 필드를 대체 할 것이다) 재미있는 것들 :

creator = Article.objects.all()[:1][0].creator.getUserProfile().headline 

편집자는 편집을 추적하고 싶다면 django-versions을 사용하십시오.

class Article(VersionedModel)

편집이 : 실제로 사용자에게

+0

흥미 롭습니다. 정말 도움이됩니다. 확실히하기 위해 UserProfile에서 일대일 필드가 필요하지 않습니까? 왜냐하면 나는 User 모델을 확장하는 장고 튜토리얼을보고 있었기 때문에 거기에 필요하다는 것을 보여 주었다. 그리고 나중에 사용자를 기본 키로 사용하는 것이 훨씬 의미가 있습니다. 다시 한번 대단히 감사합니다. – de1337ed

0

"별난"이 없습니다. 이것은 데이터베이스 구조 문제와 같은 장고 문제가 아닙니다. 표 사이에 약 1 : 1, 1 : n 및 n : n 관계를 읽어야합니다.

기사의 모든 편집자를 기록해야합니까? 기사에는 많은 편집자가 있으며 사용자는 많은 기사를 편집 할 수 있으므로 다 대다 관계입니다. Here's how do do it in django.

+0

야를 하위 클래스, 내가 그에 읽어 가야 같아요. 다 대다 필드를 어디에 정의 할 것인가?나는 단지 userProfile의 "article"속성을 many-to-many 필드로 바꾸는 것을 생각했다. 또한, 내가 창조자를 계속 추적하고 싶다면 올바른 "창조자"속성을 설정하는 방법입니까? 창조주와 편집자를 계속 추적 할 계획이었던 것처럼. – de1337ed

+0

'creator' 속성은 다 대일 관계이기 때문에 정확합니다. 다 대다 필드를 정의하는 곳은 중요하지 않습니다. –

0

아마도 마지막 편집기에 대한 기사 모델의 다른 필드가 필요한 정보를 제공 할 것입니다. article_id를, 편집자 및 편집 시간 (어쩌면 문서 텍스트 변경 내용에 관심이 있다면) :

lastEditor = models.ForeignKey(userModel.UserProfile)

당신이 정말로 당신이 뭔가를 기록하는 또 다른 모델을 구현하는 데 필요한 모든 편집기를 유지하려면

. 그런 다음 현재 기사를 기반으로이 메달을 쿼리하여 모든 편집자의 목록을 얻을 수 있습니다.

당신이 같은 행동을 할 수

: 기사의 제작자의 목록을 얻으려면 article_id를 창조자가 가능

from django.db.models import * 
from django.contrib.admin.models import User 

# UserProfile should be provided by django-profiles 
class UserProfile(User): # Subclassing user creates an automatic 1-1 called user 
    headline = CharField() 
    industry = CharField() 

class Article(Model): 
           # ALWAYS primary key to User, not UserProfile 
    creator =  ForeignKey(User, related_name='articles_created') 
    contributors = ManyToManyField(User, related_name='articles_edited') 
    created =  DateTime(auto_now_add=True) 
    modified =  DateTimeField(auto_now=True) 
    title =  CharField() 
    text =   TextField() 
    class Meta: 
     order = ['created', 'title'] 

관련 문제