2015-06-27 67 views
-1

我在django中有一個自定義用戶模型,其中user1報告給層次結構中的另一個用戶2。該用戶將向另一個用戶3報告等等,直到頂級用戶4不向任何人報告。因此,除非滿足這個條件,否則分配給最低層的所有任務應該分配給該用戶1,而分配給他的所有任務應該在用戶2上可用,等等。因此,user4應該能夠查看其下的用戶的所有任務狀態,即user1,2,3。直到用戶沒有向其他人報告時,該層次的深度纔是已知的。是否有一個迭代函數來確定最後一個user4級別,可以使用lambda或一些遞歸循環等以簡單的方式在python中編寫?示例代碼嘗試:python循環直到深度未知django

解析爲: 在模型管理員查詢集:

rep_users = [] 
reporting_custom_users = CustomUser.objects.filter(
    report_to=request.user.customuser.pk) 

if reporting_custom_users: 
    rep_users = get_all_users(self,request,reporting_custom_users) 
else: 
    rep_users = [request.user] 

qs = Task.objects.filter(Q(assigned_to__in=rep_users)| 
         Q(requestor__in=rep_users)) 

return qs 

的遞歸函數,我試過:

sub_users = [] 
def get_all_users(self,request,reporting_custom_users): 
    rep_users = [] 
    for n in reporting_custom_users: 
     sub_users.append(n) 
     while True: 
      get_all_users(self,request,CustomUser.objects.filter(
        report_to=n)) 
      if n.report_to is None: 
       rep_users.append(n) 
      break 
rep_users += sub_users 
rep_users.append(request.user.customuser) 

reporting_users = [] 
for m in list(set(rep_users)): 
    reporting_users.append(User.objects.get(id=m.muser.pk)) 

return reporting_users 

唯一的照顧將要採取的是,如果USER1向用戶2報告,同一用戶2不向用戶1報告。這可以在表單驗證中完成。

+1

您是否嘗試過任何代碼?我們甚至不知道你的自定義用戶模型是什麼樣子的(它是否具有'hierarchy'屬性?),但是可能有很多方法來實現它。 – Evert

回答

1

你可以嘗試展平它。

def flatten(di): 
    stack = [di] 
    while stack: 
     e = stack[-1] 
     for k, v in e.items(): 
      if isinstance(v, dict): 
       stack.append(v) 
      else: 
       yield k, v 
     stack.remove(e) 

然後,你可以這樣做:

for k, v in flatten(mycomplexdict): 
    process(k, v)