我需要将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)
当我尝试在南方生成这个新模型时,我得到了错误:
TypeError: make_uuid() takes exactly 1 argument (0 given)
答案 0 :(得分:12)
Django 1.8附带内置UUID field
示例:
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
答案 1 :(得分: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)
然而,这不是理想的解决方案。最好创建一个自定义数据库字段。由于这是一个常见问题,因此有很多版本。我个人喜欢david cramer's version。
答案 2 :(得分:-1)
您正在传递函数,该函数将在models.Charfield
中的某处向下调用,而不是从LinkRenewAd
的某个对象调用,因此不会传递任何对象的实例(self
)这个方法,实际上是期望一个。因此,请将其设为static function或lambda函数,或将其定义为类的非成员。