我想向MySql数据库中添加一个generated column,并且正在寻找一种方法来从Django模型对象中读取该列,但是却没有 ever 尝试在插入/更新上为该列写一个值,MySql会对此抛出错误。
我知道您可以轻松地在管理网站的表单上将字段设置为只读,但是有没有办法在模型/字段级别设置此字段?
答案 0 :(得分:1)
另一种选择是覆盖默认管理器,以返回始终用该列中的值注释的QuerySet
:
from django.db.models.expressions import RawSQL
class MyManager(models.Manager):
def get_queryset(self):
return super().get_queryset().annotate(
my_field=RawSQL('''"{table}"."myfield"'''.format(
table=self.model._meta.db_table
), ())
)
然后在模型中设置objects = MyManager()
,并且每当您获取对象时,它们都将用您想要的字段进行注释:
instance = MyModel.objects.first()
instance.my_field # value from db annotation
答案 1 :(得分:0)
您应该能够添加执行原始SQL查询的方法。
答案 2 :(得分:0)
这是另一种选择:
def get_deferred_fields(self):
deferred_fields = super(MyModel, self).get_deferred_fields()
# Exclude MySQL generated columns, which cannot be saved
deferred_fields.update({
"my_generated_column_field1",
"my_generated_column_field2",
})
return deferred_fields
注意:get_deferred_fields()
是一个公共方法,可以重写,但是可能会有意想不到的副作用。在我的django应用中,只有在save()
期间才被调用,而从未在refresh_from_db()
期间被调用,但是可以。