我想使用 Django 模型来访问数据库行的子集。使用许多遗留数据库,如果可能的话,我宁愿不创建数据库视图。
简而言之,我想告诉我的模型,有些字段foo
应该始终具有 value bar
。这应该跨越表的任何 CRUD 操作,以便新创建的行也将具有foo
= bar
。对于我想要实现的目标,是否有一种简单的 Django 方式?
更新:我想确保这个模型不会在foo
!=的表中写入任何内容bar
。它必须只能读取、修改或删除foo
=的那些行bar
。
我想使用 Django 模型来访问数据库行的子集。使用许多遗留数据库,如果可能的话,我宁愿不创建数据库视图。
简而言之,我想告诉我的模型,有些字段foo
应该始终具有 value 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
您应该实现您的自定义管理器。您可以重新定义get_query_set
添加过滤的方法。
class BarManager(models.Manager):
use_for_related_fields = True
def get_query_set(self):
return super(BarManager, self).get_query_set().filter(foo='bar')
@tuomassalo 评论后更新
1) 自定义管理器将影响对的所有调用,MyModel.objects.get(id=42)
因为此调用只是代理对 的调用.get_query_set().get(id=42)
。为此,您必须将 Manager 设置为模型的默认管理器(将其分配给objects
变量)。
要使用此管理器进行相关查找(例如another_model_instance.my_model_set.get(id=42)
),您需要use_for_related_fields = True
对您进行设置BarManager
。请参阅文档中的控制自动管理器类型。
2)如果你想强制执行,foo=bar
那么default
价值对你来说是不够的。您可以使用pre_save
信号或覆盖save
模型上的方法。不要忘记调用原始的保存方法。
我更新了MyModel
上面的例子。