有没有办法在django中使用GUID?

时间:2009-05-21 19:14:05

标签: sql-server django django-pyodbc

我在SQL Server中有几个由GUID连接的表。现在,我发现了一些自定义字段来添加对django中GUID的支持,但是如果可能的话,我倾向于回避在博客文章中使用代码。除了加入GUID之外,我不会对GUID做任何事情,也许会为新条目分配GUID(尽管这是可选的)。有没有办法允许使用django的内置类型?我可以使用某种char字段或二进制字段并使用它来“欺骗”django加入吗?

如果有任何帮助,我正在使用django-pyodbc。

6 个答案:

答案 0 :(得分:16)

我创建了一个基本的GUID模型,以便为我项目中的任何其他模型重用它的属性。模型继承在Django 1.0之前的几个版本中运行良好,并且在Django 1.0中非常稳定。

创建类似project / common / models.py的东西,然后放在这个类:

import hashlib
import random
from django.db import models

class GUIDModel(models.Model):

    guid = models.CharField(primary_key=True, max_length=40)

    def save(self, *args, **kwargs):

      if not self.guid:
        self.guid = hashlib.sha1(str(random.random())).hexdigest()

      super(GUIDModel, self).save(*args, **kwargs)

然后像往常一样创建其他模型:

from common.models import GUIDModel

class Customer(GUIDModel):
  name = models.CharField(max_length=64)

class Product(GUIDModel):
  name = models.CharField(max_length=64)

class Sale(GUIDModel):
  customer = models.ForeignKey(Customer)
  product = models.ForeignKey(Product)
  items = models.PositiveIntegerField()

所有内容都可以很好地与GUID一起使用,而不是自动增量整数。

答案 1 :(得分:8)

看看Django-extensions UUID Field

答案 2 :(得分:5)

老问题,但对于任何使用Django 1.8+的人来说,内置的UUIDField都可以派上用场。

答案 3 :(得分:0)

如果我执行python manage.py inspectdb输出是这样的:

class SomeModel(models.Model):
    uid = models.TextField(primary_key=True)

class SomeOtherModel(models.Model):
    uid = models.TextField()

但这不起作用。无论出于何种原因,如果uid是主键,这将不起作用。所以我把它改成了这个:

class SomeModel(models.Model):
    uid = models.TextField()

class SomeOtherModel(models.Model):
    somemodel = models.ForeignKey(SomeModel, db_column='uid', to_field='uid')

这似乎有效,但痛苦慢。

答案 4 :(得分:0)

Django现在在1.8及更高版本中包含了UUID字段。 用于存储通用唯一标识符的字段。使用Python的UUID类。在PostgreSQL上使用时,它存储在uuid数据类型中,否则存储在char(32)中。 该字段通常用作主键,这是如何在模型中使用它->

your_app / models.py

import uuid
from django.db import models

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

答案 5 :(得分:-3)

对于那些实际需要生成GUID的人:

guid = hashlib.sha1(str(random.random())).hexdigest()