使用UUID作为主键的实现方法

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)   

当我尝试在南方生成这个新模型时,我遇到了错误:

TypeError: make_uuid() takes exactly 1 argument (0 given)
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)

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 的版本


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接