Внедрение UUID в качестве первичного ключа

Мне нужно реализовать 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)

Ответ 1

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)

Ответ 2

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.

Ответ 3

Вы передаете функцию вокруг, которая будет вызываться где-то вниз в models.Charfield, вместо этого из некоторого объекта LinkRenewAd, поэтому экземпляр какого-либо объекта (self) не передается этому методу, что фактически ожидает один. Итак, сделайте это статической функцией или лямбда-функцией или определите ее как нечлен класса.