【问题标题】:Django model with computed column具有计算列的 Django 模型
【发布时间】:2013-06-26 05:13:25
【问题描述】:

如何在 django 模型中表示具有默认值(在 SQL 中指定)的列?

表:

CREATE TABLE myTable
(
    id SERIAL,
    myGuid VARCHAR DEFAULT uuid_generate_v4(),
    anotherColumn VARCHAR
)

型号:

class myTable(models.Model):
    id = models.AutoField(primary_key=True)
    #How to represent myGuid column
    anotherColumn = models.CharField(max_length=40)

    class Meta:
        db_table = "myTable"

我正在使用 Python 2.7.3 和 Django 1.4.2

【问题讨论】:

  • 这是未经测试的,我可能会忽略一些东西,所以我没有把它作为答案。但是我看不出有任何理由不能直接在数据库客户端中创建表,而不是通过syncdb,然后在模型上声明一个带有blank=True 的字段,这样您就可以在不需要非默认值的情况下进行验证领域。
  • @PeterDeGlopper 我还能用blank=True 访问myGuid 吗?换句话说,blank=True 是否使myGuid 只读,我可以从数据库中读取myGuid,但永远不会将myGuid 的值写入数据库?
  • 不,blank=True 只允许管理员等验证模型,而无需在 Python 表示中为 myGuid 设置值。您仍然可以更改 myGuid 值。如果您希望它不可编辑但仍然可读,我想不出一种让 Django 普遍做到这一点的方法——也许拒绝 Django 用户在数据库级别的更新访问会这样做?您可以通过模型上的自定义 save 方法来近似它,但这可以通过原始 SQL 查询绕过。
  • 你不能用 Django 真正做到这一点,或者更确切地说不能用 ./manage.py syncdb。您最好在class Meta 中设置managed=False 并手动创建表。

标签: python django postgresql-9.1


【解决方案1】:

您可以使用 python 中的 uuid 作为 uuid 字段的默认值,而不是在 DB 级别定义它。

import uuid
def get_uuid():
    return str(uuid.uuid4())

class myTable(models.Model):
    id = models.AutoField(primary_key=True)
    myuuid = models.CharField(max_length=40, unique=True, default=get_uuid)
    anotherColumn = models.CharField(max_length=40)

    class Meta:
        db_table = "myTable"

【讨论】:

  • 感谢您提供的信息,但出于几个原因,我想在数据库级别定义它。一个简单的原因是,我希望其他开发人员能够轻松插入此表,而不必记住使用 uuid_generate_v4 函数。
  • @steaks,处理此类字段的开销(不是由 django 管理,而是使用)更多,正如 Peter 在 cmets 中所解释的那样。您可能希望为此定义一个自定义模型字段,然后您只需使用该字段定义模型。
猜你喜欢
  • 2018-03-16
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 2016-01-14
  • 2016-05-14
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多