2009-12-24 70 views
0

我有一個相當複雜的關係,我試圖使用Django管理站點進行工作。我花了相當一段時間來試圖解決這個問題,看起來好像我沒有得到Django模型背後的哲學。Django:構建與內置管理站點配合使用的複雜關係

有一個組的列表。每個小組都有多個部門。也有員工。每個員工屬於一個組,但某些員工也屬於一個組內的一個部門。 (有些員工可能只屬於一個集團,但不屬於部門,但沒有員工只屬於一個部門)。

這裏是什麼,我現在有一個簡化版本:

class Group: 
    name = models.CharField(max_length=128) 

class Department 
    group = models.ForeignKey(Group) 

class Employee 
    department = models.ForeignKey(Department) 
    group = models.ForeignKey(Group) 

這樣做的問題是,員工頁面上的部門選擇框必須顯示所有的部門,因爲一組尚未設定。我試圖通過爲GroupAdmin頁面創建一個EmployeeInline來糾正這種情況,但在非分頁內聯中擁有500多名員工並不好。我必須能夠爲Employees員工使用models.ModelAdmin頁面(除非有內聯搜索,排序,摺疊和執行操作的方法)。

如果我讓EmployeeInline DepartmentAdmin的內聯(而不必在GroupAdmin一個DepartmentInline),那麼事情更糟,因爲它是不可能有不屬於一個集團的員工。

鑑於我對關係的描述,我是否錯過了Django ORM的某些部分,這將允許我按照「應該」的方式構建這種關係,而不是剽竊並試圖讓事情走到一起?

非常感謝。

回答

3

這聽起來像你想要的部門選項只是那些ForeignKey'ed到組?標準答案是管理網站僅適用於簡單的CRUD操作。

但是做你應該做的事是無聊的。

你可以用一些忍者javascript和JSON來克服這個限制。

所以首先,我們需要一個API,讓我們知道哪些部門可用於每個組。

def api_departments_from_group(request, group_id): 
    departments = Department.objects.filter(group__id=group_id) 
    return json(departments) # Note: serialize, however 

一旦API是在地方,我們可以添加一些JavaScript來改變對部門<option>的選擇...

$(function() { 
    // On page load... 
    if ($('#id_group')) { 
     // Trap when the group box is changed 
     $('#id_group').bind('blur', function() { 
      $.getJSON('/api/get-departments/' + $('#id_group').val() + '/', function(data) { 
       // Clear existing options 
       $('#id_department').children().remove(); 
       // Parse JSON and turn into <option> tags 
       $.each(data, function(i, item) { 
        $('#id_department').append('<option>' + item.name + '</option>'); 
       }); 
      }); 
     }); 
    } 
}); 

保存,要管理,ninja.js。然後,可將它的管理模式本身......

class EmployeeAdmin(models.ModelAdmin): 

    # ... 

    class Media: 
     js = ('/media/admin-ninja.js',) 

呀,所以我沒有測試這種下降,但你可以希望得到一些想法。此外,我沒有看到任何東西,例如javascript沒有考慮已經被選中的選項(然後重新選擇它)。