15

我需要将 UUID 实现为主键,但我不确定如何在 Django 中实现。

我的代码

class LinkRenewAd(models.Model): # This model will generate the uuid for the ad renew link
    def make_uuid(self):
        return str(uuid.uuid1().int>>64)

    uuid = models.CharField(max_length=36, primary_key=True, default=make_uuid, editable=False)
    main = models.ForeignKey(Main)
    expiration_date = models.DateTimeField()
    date_inserted = models.DateTimeField(auto_now_add=True)
    date_last_update = models.DateTimeField(auto_now=True)   

当我尝试在 South 上生成这个新模型时,我得到了错误:

TypeError: make_uuid() takes exactly 1 argument (0 given)
4

3 回答 3

13

Django 1.8 带有一个内置的UUID 字段

例子:

import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
于 2015-09-03T11:40:47.743 回答
8

self意味着你需要传入一个实例。在您的情况下,您没有实例,这就是为什么您会看到缺少参数的奇怪错误。

要解决您的问题,请将生成字段的方法移出模型类:

def make_uuid():
    return str(uuid.uuid1().int>>64)

class Foo(models.Model):
    id = models.CharField(max_length=36, primary_key=True, default=make_uuid)

然而,这不是理想的解决方案。最好创建一个自定义数据库字段。由于这是一个常见问题,因此有很多版本。我个人喜欢大卫克莱默的版本

于 2013-02-13T13:12:14.187 回答
-1

您正在传递函数,它将在 中的某个地方调用models.Charfield,而不是从 的某个对象LinkRenewAd,因此没有任何对象 ( self) 的实例被传递给这个方法,它实际上需要一个。因此,改为将其设为静态函数或 lambda 函数,或将其定义为类的非成员。

于 2013-02-13T13:00:43.607 回答