16

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

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

4

6 回答 6

19

我会创建一个基本的 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 作为主键而不是自动增量整数。

于 2009-09-15T21:00:16.780 回答
8

看看 Django-extensions UUID Field

于 2010-04-05T06:46:19.717 回答
5

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

于 2015-12-14T00:57:20.170 回答
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')

这似乎有效,但速度非常缓慢

于 2009-05-22T13:49:32.047 回答
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
于 2020-10-07T16:14:06.860 回答
-3

对于那些真正需要生成 GUID 的人:

guid = hashlib.sha1(str(random.random())).hexdigest()
于 2009-08-28T19:42:44.777 回答