2009-12-01 1 views
1

저는 사람의 프로필을 구축하기 위해 다양한 정보 소스를 사용하고 있습니다. 이렇게하면 다른 방식으로 사람을 볼 수있는 유연성을 원합니다. 나는 장고에 많은 expierience가 없다. 그래서 나는 내 모델에 대해 비판하고 싶다. 틀림없이 내가 코딩 한 것처럼 나는 중복 (DRY에 반대)을 생각하고 있지만 다른 사람들이 생각하는 것을 알고 싶다. FWIW -이 데이터는 생성되지 않았으므로 어쨌든 데이터를 삭제하지 않아야합니다.내 장고 모델을 검토하십시오 - 많은 제안이 필요합니다

구체적으로 ManyToMany의 사용이 적합한 지 알고 싶거나 키스하고 각 항목을 남겨두고 싶습니다. ManyToMany 비즈니스가 없어도 자신의 것입니다. 장기간 나는 KISS가 간단하게 (루프를위한 기본으로) 업데이트 할 것이라고 생각하지만, location_description이나 job_function을 기반으로 한 사람을 쿼리 할 수 ​​있다는 단점이있다. 어쨌든 나는 약간의 의견을 고맙게 여길 것이다.

class Person(models.Model): 

    """This simply builds a notes user""" 

    aliases = models.ManyToManyField(Aliases) #Hmm this is list.. 
    assistant = models.CharField(max_length = 255, blank = True) 
    cell_phone = models.CharField(max_lenth = 16, blank = True) 
    city = models.ManyToManyField(City) 
    country = models.ManyToManyField(County) 
    department = models.ManyToManyField(Department) 
    departmeht_number = models.ManyToManyField(Department_Number) 
    division_code = models.ManyToManyField(Division_Code) 
    email = models.EmailField(max_length = 50) 
    functional_area = models.ManyToManyField(Functional_Area) 
    # jpeg = models. 
    job_classification = models.ManyToManyField(Job_Classification) 
    job_classification_code = models.ManyToManyField(Job_Classification_Code) 
    last_name = models.CharField(max_length = 255) 
    location_description = models.ManyToManyField(Location_Description) 
    location_path = models.ManyToManyField(Location_Path) 
    mail_address = models.CharField(max_length = 255, blank = True) 
    mail_domain = models.ManyToManyField(Mail_Domain) 
    mail_file = models.CharField(max_length = 255, blank = True) 
    mail_server = models.ManyToManyField(Mail_Server) 
    match_pct = models.CharField(max_lenth = 6) 
    name = models.CharField(max_length = 255) 
    name_reverse = models.CharField(max_length = 255) 
    nickname = models.CharField(max_length = 32) 
    notes_url = models.URLField() 
    # object_class = models. 
    office_phone = models.CharField(max_length = 255, blank = True) 
    other_phone = models.CharField(max_length = 255, blank = True) 
    position = models.ManyToManyField(Position) 
    section = models.ManyToManyField(Section) 
    section_code = models.ManyToManyField(SectionCode) 
    shift = models.ManyToManyField(Shift) 
    state = models.ManyToManyFiedl(State) 
    supervisor = models.ManyToManyField(Supervisor) 
    supervisor_reverse = models.ManyToManyField(Supervisor_reverse) 
    uid = models.CharField(max_length = 128) 

    def __unicode__(self): 
     return str(self.name) 
+0

일반적으로 개체 계층 구조에 대한 신중한 고려가 끝나면이 같은 것이 많이 발생합니다. – Evgeny

+0

여기 KISS를 "유용한 덩어리로 분류 된 정보"로 정의해야한다고 생각합니다. 선택, 필터링, ... 및 더 적은 NULL 값을 갖는 압축 된 데이터베이스를위한 좋은 개체 계층 구조로 이어질 것입니다. – vikingosegundo

+0

vikingosegundo - 좋은 충고 - 나는 모든 사람들의 제안을 따르고있다. 하지만 null 값이 줄어들지 않습니다! 감사합니다 – rh0dium

답변

2

다음은 몇 가지 생각입니다.

departmentjob_classification 등의 모델을 별도로 만들어야한다고 생각합니다. 예를 들어

class department(models.Model): 
    name = Models.CharField(max_length=100) 
    number = Models.IntegerField 

다음에 ManyToManyField를 지정합니다. 그렇지 않은 사람이 department = ['HR', 'Finance']이고 department_number = [12, 5] 인 경우 어떤 부서 번호가 어떤 부서를 나타내는 지 알 수있는 방법이 없다고 생각합니다.

알파벳순으로 정렬하지 않고 필드가 그룹화되어 있으면 해당 필드를 쉽게 읽을 수 있습니다. E.G 나는 name, nickname, last_name을 함께 정의해야한다고 생각합니다.

마지막으로 앨리어스는 별개의 모델이어야하며 ForeignKey에서 Person까지입니다. 단 하나의 사람에게 특정 별칭이 있어야하기 때문입니다.

mail = models.EmailField() 

내 생각은하는 주소 모델은 감각 가득 수 있습니다

+0

분명히 이것을하고 있습니다. 그것은 논리적으로 합리적입니다. 감사! – rh0dium

4

많은 ManyToMany 관계는 대상 모델의 속성으로 대체되어야합니다.

예를 들어 citycountry이 별개의 관계로 표시됩니다. 즉, 사용자가 city = ['Paris', 'London', 'New York']country = ['USA', 'France', 'UK'] 인 사용자가 될 수 있습니다.

대신 locations ManyToMany 관계가 citycountry 속성으로 구성된 모델을 가리켜 야한다고 생각합니다. departmentdepartment_number, job_classificationjob_classification_code, location_descriptionlocation_path와 같은

편집 : 어떤 경우에는 대신 ManyToMany의 외래 키를 사용할 수 있습니다. 아마도 사용자는 citycountry 중 하나에만 속할 수 있습니까? position가 부서/단위를 가리켜 야하고 is_supervisor 가능성이 위치의 속성해야하기 때문에

Positionsupervisor 가능성의 난이도 관계의 일부가 될 것입니다. 즉, 감독자가 다른 사용자의 직책에서 검색 될 때 위치를 가리켜 야합니다.

편집 : 예 : 사람 A가 부서 X와 사람 B는 부서의 X에서 작동하지만 관리자로, 다음 사람 A가 사람 B.

편집이 감독에 작동하는 경우 : 한 부서에 관리자가 하나만 있거나 관리자가 한 부서 만 관리 할 수 ​​있다고 가정하는 것은 유혹스러운 일입니다. 나는 조직이 모든 종류의 특별한 경우를 종종 가지고 있기 때문에 이것에 대한 충고를 할 것이다. 관리자가 회사를 떠날 때와 같이 시나리오를 생각해보십시오. 부서가 잠시 동안 관리자가 없거나 다른 관리자가 일시적으로 인계하여 두 명의 관리자 직책을 유지하게됩니다.

+0

와우 - 이것은 정말 좋은 물건입니다. 어떤 사람이 한 물리적 위치에 붙어있을 수 없으므로 ManyToMany 관계가 잘못됩니까? 당신의 위치/감독자 관찰에서 당신은 바로 sooooo입니다. 감사!! – rh0dium

+0

너무 늦게 답변 해 주셔서 죄송합니다. 예, 실제 위치에있을 수만 있다면 ForeignKey를 사용해야합니다. ManyToMany는 각 사람이 많은 위치를 가질 수 있고 각 위치에 여러 사람이 연결할 수 있음을 의미합니다. – lemonad

2

나는 종속 필드를 만들고 감독자를 제거 할 것입니다. 실제로 나는 또한 신중하게 다시 생각하는 게 좋을 것 :

subordinates = models.ManyToManyField('self', related_name='supervisors', through=Position) 

이 방법 감독자는 자동 역방향 조회 필드되며 하위

편집과 관리자를 연결하는 위치에 대한 기록이있을 것이다 - 귀하의 모델을 디자인. 어쩌면 당신이 제안하는만큼 많은 것을 필요로하지 않을 것입니다.

"부서", "회사"(여러 회사를 추적해야하는 경우), "위치", "위치"및 "사람"처럼 보입니다 ... 대기업을 결정하고, 정확하게 각 필드가 속하고 테이블로 변환 할 "큰"개체를 연결하는 방법.

사람이오고 갈 수는 있지만 포지튼은 더 영구적이기 때문에 Position 개체간에 하위 감독자 관계를 설정하는 것이 가장 좋습니다. 그래서 내가 가진 것 : 지금 subordiantes 필드가없는 경우에도

당신이 위치에 여러 감독자가 필요하지 않은 경우의
class Position: 
    title = models.CharField() #product manager, engineer, etc. 
    employee = models.ForeignKey(Person, related_name='positions') 
    subordinates = models.ManyToManyField('self', related_name='supervisors') 

supervisor = models.ForeignKey('self', related_name='subordinates') 

를 사용, 그것은 관련 통해 이전으로 액세스 할 수 있습니다 이름.

위치는 어디에 속합니까?

사람과 부서 모두에 위치가 있어야한다고 결정하면 "일반 사람"과 같이 사용하기 쉽지는 않지만 일반 관계를 생각할 수도 있지만 "유형"을 추가하는 것으로도 벗어날 수 있습니다. ('개인/업체')로 이동 한 다음 Location.company 또는 Location.residence_owner를 사용하고 일반적인 관계를 사용하지 마십시오.

+0

나는 마침내 이걸 쳤다. 그들이 사용 된 제안에 감사드립니다 !! – rh0dium

5

__unicode__ 유니 코드

def __unicode__(self): 
     return u'%s' %self.name 

장고가 완료 adresses에 대한을 emailField을 제공 반환해야합니다. 한 사람이 여러 주소를 가질 수 있습니다 (직장, 집, ...)

편집

이메일 필드를 사용하고 있습니다.

mail_address = models.CharField(max_length = 255, blank = True) 
mail_domain = models.ManyToManyField(Mail_Domain) 
mail_file = models.CharField(max_length = 255, blank = True) 
mail_server = models.ManyToManyField(Mail_Server) 

:

이 무엇입니까?

당신은 ManyToManyFields 모든 시간을 사용 해달라고

편집

. ForeignKey, OneToOneField 및 일반 프레임 워크를 확인하십시오.

+0

이것은 좋은 일입니다 - 귀하의 질문에 대답하기 위해 이것은 필자가 당당하게 사용하는 데이터 중 일부 여야합니다. 그것은 나에게 아무 의미도 없지만 아마도 다른 누군가를 의미합니다. 이제까지 나는 멀리있는 데이터를 던지기를 매우 꺼려했지만 이제는 내 위치를 약간 옮기기 시작합니다. – rh0dium

+0

자네가 가져야 할대로, 외래 사용자와 함께 LDAPUser 모델을 사용자에게 추가하십시오. – vikingosegundo

1

취업을 위해 별도의 모델을 사용하는 것이 좋습니다. Person 객체에 외래 키를 사용하십시오. 필요한만큼 테이블에 레코드를 추가 할 수 있습니다.

같은 제안은 mail_ * 필드에도 적용됩니다.