关于django:将uuid实现为主键

Implementing UUID as primary key

我需要实现UUID作为主键,但我不知道如何在Django中实现它。

我的密码

1
2
3
4
5
6
7
8
9
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)

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

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

Django 1.8带有内置UUID字段

例子:

1
2
3
4
5
import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

self表示需要通过实例。在你的例子中,你没有实例,这就是为什么你看到了一个遗漏的论点的奇怪错误。

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

1
2
3
4
5
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)

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


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