2010-09-08 58 views
1

我有一個模型,有一個布爾私人/公共屬性的Django:Django的設計問題

class TestModel(models.Model): 
    name = models.CharField() 
    is_public = models.BooleanField(default=False) 

我想,每一次我在一個應用程序查詢該模型將返回唯一的公共實例普通用戶並向超級用戶提供所有可用的實例。

如何以及在哪裏需要實現這樣的功能?

回答

4

您在視圖層實現該邏輯,可能帶有custom manager

你的經理會是這個樣子:

class PublicTestModelManager(models.Manager): 
    def get_query_set(self): 
    return super(PublicTestModelManager, self).get_query_set().filter(is_public = True) 

您的模型看起來是這樣的:

class TestModel(models.Model): 
    name = models.CharField() 
    is_public = models.BooleanField(default=False) 
    objects = models.Manager() # The default manager. 
    public_objects = PublicTestModelManager() 

然後,您可以編寫一個選擇了正確的管理器功能:

def test_objects_for_user(user): 
    if user.is_superuser: 
    return TestModel.objects 
    else: 
    return TestModel.public_objects 

然後在您看來,您可以使用:

test_objects_for_user(request.user).all() 
+0

+1。自定義管理器聽起來像是正確的路要走。 – 2010-09-08 14:16:20

+0

但我仍然需要在每個視圖中編寫if/else子句,對不對? – dragoon 2010-09-08 14:17:15

+0

@dragoon - 答案已更新。 – 2010-09-08 14:22:25