2013-06-26 63 views
0

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

表:

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和1.4.2的Django

+0

这是未经测试的,我可以忽略一些东西,所以我没有把它作为答案。但是我没有看到任何理由,你不能直接在你的数据库客户端创建你的表而不是通过syncdb,然后在你的模型中用'blank = True'声明一个字段,这样你就可以验证,该字段的默认值。 –

+0

@PeterDeGlopper我仍然可以通过'blank = True'访问'myGuid'?换句话说,'blank = True'是否使'myGuid'只读,我可以从数据库中读取myGuid,但是不会将'myGuid'的值写入数据库? –

+0

否,blank = True只允许管理员之类的内容验证模型,而不在myGuid的Python表示中设置值。您仍然可以更改myGuid值。如果你希望它是不可编辑的,但仍然可读,我不会想到一种方法让Django能够普遍地做到这一点 - 也许拒绝在数据库级别更新对Django用户的访问会这样做?您可以通过模型上的自定义“保存”方法对其进行近似处理,但可以通过原始SQL查询进行绕过。 –

回答

0

而不是在数据库级别定义它,你可以使用uuid来自python,作为uuid字段的默认值。

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" 
+0

感谢您的信息,但我想在数据库级别定义它有几个原因。一个简单的原因是,我希望其他开发人员能够轻松地插入此表,而不必记住使用'uuid_generate_v4'函数。 –

+0

@steaks,处理这个领域的开销(不是由django管理,但使用)更像Peter在评论中解释的那样。您可能想为此定义一个自定义模型字段,然后您只需使用该字段定义模型。 – Rohan