2013-02-13 36 views
12

Tôi cần triển khai UUID làm khóa chính nhưng tôi không chắc chắn cách thực hiện trong Django.Thực hiện UUID làm khóa chính

Mã của tôi

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) 

Khi tôi cố gắng để tạo ra mô hình mới này vào Nam tôi đã nhận lỗi:

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

Trả lời

-1

Bạn đang đi qua các chức năng xung quanh, mà sẽ được gọi lên đâu đó xuống models.Charfield, thay vì từ một số đối tượng của LinkRenewAd, do đó, không có cá thể nào của bất kỳ đối tượng nào (self) được chuyển đến phương pháp này, vốn thực sự mong đợi một đối tượng. Vì vậy, thay vào đó, hãy đặt nó là static function hoặc hàm lambda hoặc xác định nó là không phải là thành viên của lớp.

8

self có nghĩa là bạn cần chuyển vào một phiên bản. Trong trường hợp của bạn, bạn không có một ví dụ, đó là lý do tại sao bạn đang nhìn thấy lỗi lạ của một đối số còn thiếu.

Để giải quyết vấn đề của bạn, di chuyển phương pháp mà tạo ra lĩnh vực này của ra khỏi lớp mô hình của bạn:

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) 

Tuy nhiên, đây không phải là giải pháp lý tưởng. Tốt hơn hết là tạo trường cơ sở dữ liệu tùy chỉnh. Vì đây là một vấn đề phổ biến, có rất nhiều phiên bản trên mạng. Cá nhân tôi thích david cramer's version.

+0

+1: Cảm ơn các liên kết đến các phiên bản dcramer. –

10

Django 1.8 đi kèm với một built-in UUID field

Ví dụ:

import uuid 
from django.db import models 

class MyUUIDModel(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
Các vấn đề liên quan