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