我想使用Django模型來訪問數據庫行的子集。如果可能的話,使用大量遺留數據庫,我寧可不創建數據庫視圖。限制模型只訪問具有特定條件的行?
總之,我想告訴我的模型,有字段foo
應該總是值bar
。這應該跨越該表的任何CRUD操作,以便新創建的行也將具有foo
= bar
。有沒有簡單的Django方法來實現我想要實現的目標?
更新:我想確保這個模型不寫任何表格,其中foo
!= bar
。它必須能夠讀取,修改或刪除foo
= bar
的那些行。
我想使用Django模型來訪問數據庫行的子集。如果可能的話,使用大量遺留數據庫,我寧可不創建數據庫視圖。限制模型只訪問具有特定條件的行?
總之,我想告訴我的模型,有字段foo
應該總是值bar
。這應該跨越該表的任何CRUD操作,以便新創建的行也將具有foo
= bar
。有沒有簡單的Django方法來實現我想要實現的目標?
更新:我想確保這個模型不寫任何表格,其中foo
!= bar
。它必須能夠讀取,修改或刪除foo
= bar
的那些行。
對於新創建的項目,你可以設置模型定義的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
示例。
感謝您的回答。我在我的問題上加了一個說明。 'default ='bar''不執行*'foo = bar'。我應該使用例如。一個pre_save鉤?另外,一個自定義的'管理器'影響例如。 '.objects.get(ID = 42)'? – tuomassalo 2013-04-09 12:42:00
@tuomassalo我更新了我的答案和其他問題 – Igor 2013-04-10 07:50:24