2013-04-09 46 views
0

我想使用Django模型來訪問數據庫行的子集。如果可能的話,使用大量遺留數據庫,我寧可不創建數據庫視圖。限制模型只訪問具有特定條件的行?

總之,我想告訴我的模型,有字段foo應該總是值bar。這應該跨越該表的任何CRUD操作,以便新創建的行也將具有foo = bar。有沒有簡單的Django方法來實現我想要實現的目標?

更新:我想確保這個模型不寫任何表格,其中foo!= bar。它必須能夠讀取,修改或刪除foo = bar的那些行。

回答

1

對於新創建的項目,你可以設置模型定義的default

class MyModel(models.Model): 
    # a lot of fields 
    foo = models.CharField(max_length=10, default='bar') 

    # Set the manager 
    objects = BarManager() 

    def save(self, force_insert=False, force_update=False, using=None): 
     self.foo = 'bar' 
     super(MyModel, self).save(force_insert, force_update, using) 

爲了實現這一MyModel.objects.all()應該只返回行與foo=bar你應該實現your custom manager。您可以重新定義get_query_set方法來添加過濾。 @tuomassalo評論

1)後

class BarManager(models.Manager): 
    use_for_related_fields = True 

    def get_query_set(self): 
     return super(BarManager, self).get_query_set().filter(foo='bar') 

更新自定義的經理會影響,因爲這只是調用代理.get_query_set().get(id=42)呼叫所有呼叫MyModel.objects.get(id=42)。爲此,您必須將Manager設置爲模型的默認管理器(將其分配給objects變量)。

要使用此管理器進行相關查找(例如another_model_instance.my_model_set.get(id=42)),您需要在您BarManager上設置use_for_related_fields = True。請參閱文檔中的Controlling automatic Manager types

2)如果你想執行foo=bar那麼default值是不夠你的。您可以使用pre_save信號或覆蓋模型上的save方法。不要忘記調用原始的保存方法。

我更新了上面的MyModel示例。

+0

感謝您的回答。我在我的問題上加了一個說明。 'default ='bar''不執行*'foo = bar'。我應該使用例如。一個pre_save鉤?另外,一個自定義的'管理器'影響例如。 '.objects.get(ID = 42)'? – tuomassalo 2013-04-09 12:42:00

+0

@tuomassalo我更新了我的答案和其他問題 – Igor 2013-04-10 07:50:24

相關問題