Django模型字段仅对MySql生成的列只读

时间:2019-04-18 14:51:17

标签: mysql django django-models django-orm

我想向MySql数据库中添加一个generated column,并且正在寻找一种方法来从Django模型对象中读取该列,但是却没有 ever 尝试在插入/更新上为该列写一个值,MySql会对此抛出错误。

我知道您可以轻松地在管理网站的表单上将字段设置为只读,但是有没有办法在模型/字段级别设置此字段?

3 个答案:

答案 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查询的方法。

https://docs.djangoproject.com/en/2.2/topics/db/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()期间被调用,但是可以。