2014-04-03 71 views
0

我有2個Django模型:做非外鍵連接在Django經理

class Person(CommonModel): 
    """ Person """ 
    person_type = models.ForeignKey(PersonType) 
    ciam_id = models.PositiveIntegerField() # ForeignKey('ciam.person_id') 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    middle_name = models.CharField(max_length=50) 
    empl_id = models.CharField(max_length=8) 
    pcn = models.CharField(max_length=50) 
    ... 

class PositionHierarchy(CommonModel): 
    """ Position Hierarchy """ 
    pcn = models.CharField(max_length=50) 
    title = models.CharField(max_length=100) 
    level = models.CharField(max_length=25) 
    reports_to_pcn = models.CharField(max_length=50, db_index=True) # FK? 

不幸的是,我無法控制的原因(與超越的原因),唯一的辦法判斷一個人是否是經理是看Person.pcn,用pcn查找他們的PositionHierarchy,然後在PositionHierarchy中查看他們的級別。同樣,找到經理姓名(我需要很多)的唯一方法是使用他們的Person.pcn,通過pcn查找他們的PositionHierarchy,通過reports_to_pcn查找他們經理的PositionHierarchy,然後使用該pcn查找經理的人員記錄。並且這些PCN都不允許被PositionHeirarchy模型的外鍵替換。多麼令人費解的混亂,對吧?

所以我需要能夠快速查找一個人,並查看他們的級別和經理姓名。

回答

0

的解決方案是基於this blog post定製經理:

class PersonWithManagerManager(CommonManager): 
    """ Manager to get a query that adds the level and manager name 
    to the person record """ 
    def get_query_set(self): 
     qs = super(PersonWithManagerManager, self).get_query_set() 
     cp_tab = qs.query.get_initial_alias() 
     # Join to the PCN table to find the position 
     pcn_tab = qs.query.join(
      (
       cp_tab, 
       PositionHierarchy._meta.db_table, 
       'pcn', 
       'pcn' 
      ), promote=True) 
     # Find the manager's PCN 
     man_pcn_tab = qs.query.join(
      (
       pcn_tab, 
       PositionHierarchy._meta.db_table, 
       'reports_to_pcn', 
       'pcn' 
      ), promote=True) 
     # Find the manager's person record 
     man_per_tab = qs.query.join(
      (
       man_pcn_tab, 
       'cart_person', 
       'pcn', 
       'pcn' 
      ), promote=True) 
     return qs.extra(
      select={ 
       'level': '%s.level' % pcn_tab, 
       'manager_last_name': '%s.last_name' % man_per_tab, 
       'manager_first_name': '%s.first_name' % man_per_tab, 
      } 
     ) 

現在我能做的print Person.extra_objects.filter(last_name='Tomblin').manager_last_name,讓我的經理的姓氏。我還不能做的一件事是過濾他們。