2012-06-19 24 views
5

Tôi đang làm việc trên một sản phẩm cho phép các trường khác nhau quản lý nội dung của họ trực tuyến.Nhóm Django và Quyền. Mở rộng nhóm để có một FK?

Một phần của việc này liên quan đến việc thiết lập logic điều khiển truy cập dựa trên vai trò mà tôi đã tự viết. Về cơ bản, mỗi trường có một bộ vai trò riêng có bộ quyền riêng. Một người sử dụng phần mềm có thể thuộc về các trường học mulitple với vai trò khác nhau tại bất kỳ thời điểm nào.

Vì nhiều lý do, tôi muốn bỏ điều này và thay vào đó sử dụng Nhóm và Quyền của Django cùng với thư viện như django-guardian. Vấn đề mà tôi đang phải đối mặt là làm thế nào tôi nên đi về mở rộng mô hình nhóm như vậy mà tôi có thể bao gồm một khóa nước ngoài cho mỗi trường mới và vẫn có thể sử dụng các phương pháp trợ giúp ở Django và các thư viện như django-người giám hộ. Một trong những cách tiếp cận của tôi là tạo ra các nhóm dựa trên tên sự kiện như 'Trường 1 - Quản trị', 'Trường 1 - Giáo viên', 'Trường 2 - Quản trị', 'Trường 2 - Giáo viên' và cho phép truy vấn dựa trên điều này thay thế. Có lý do chính đáng tại sao tôi không nên làm theo cách này?

+0

bản sao có thể có của [mối quan hệ một-nhiều-django] (http://stackoverflow.com/questions/10975140/django-one-to-many-relation) – jpic

Trả lời

0

Tại sao không kết hợp cả hai phương pháp tiếp cận? Mô hình Django cho phép inheritence. Đầu tiên xác định mô hình Role, với vai trò được phép và mô hình trường học.

Sau đó, bạn có thể kế thừa một mô hình mới từ django.contrib.auth.Group nói GroupRole. Django sẽ tạo một bảng db mới cho mô hình của bạn chỉ chứa các thuộc tính không phải ban đầu trong nhóm với một khóa ngoại để nhóm thích hợp với các ràng buộc. Thậm chí tốt hơn, bạn sẽ nhận được một mối quan hệ ngược tự động với mô hình nhóm ban đầu, vì vậy bạn có thể viết một cái gì đó như:

class GroupRole(Group): 
    role = models.ForeignKey(Role) 
    school = models.ForeignKey(School) 
    ... 

g = Group.objects.get(id=1) 
# you can access standard group items here g.<attribute> or g.grouprole.<attribute> 
# you can access GroupRole attributes by doing g.grouprole.<some_attribute> 

GroupRole.objects.filter(role__type='admin', school__location__state='NY') 

Trên một lưu ý thú vị, những mối quan hệ là phản xạ nên một cái gì đó như thế này là hợp lệ nếu không phải là quá hữu ích:

g.grouprole.grouprole.grouprole.grouprole.role 

Nếu bạn nhận được một trường hợp nhóm cơ sở mà không có một proxy grouprole liên kết với nó sau đó bạn sẽ nhận được một ngoại lệ ném:

g = Group.objects.create(name='myplaingroup') 
try: 
    print g.grouprole 
except GroupRole.DoesNotExist: 
    print 'This is a normal group' 

Ngoài bạn có thể ghi đè hành vi này để trả về Không có thay vì nâng cao một ngoại lệ hoặc thậm chí cung cấp một GroupRole mặc định để thay thế.

Các vấn đề liên quan