我想使用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