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)
4

3 に答える 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)
于 2015-09-03T11:40:47.743 に答える
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)

ただし、これは理想的なソリューションではありません。カスタム データベース フィールドを作成することをお勧めします。これは一般的な問題であるため、多くのバージョンが存在します。個人的にはデビッド・クレイマーのバージョンが好きです。

于 2013-02-13T13:12:14.187 に答える
-1

models.Charfieldのオブジェクトからではなく、のどこかで呼び出される関数を渡しているLinkRenewAdので、オブジェクト()のインスタンスはselfこのメソッドに渡されません。これは実際には1つを期待しています。したがって、代わりに、静的関数またはラムダ関数にするか、クラスの非メンバーとして定義します。

于 2013-02-13T13:00:43.607 に答える