我有几个通过 SQL Server 中的 GUID 连接的表。现在,我发现了一些自定义字段来添加对 django 中 GUID 的支持,但如果可能的话,我倾向于避免在博客文章中使用代码。除了加入它之外,我不会对 GUID 做任何事情,并且可能会为新条目分配一个 GUID(尽管这是可选的)。有没有办法使用 django 的内置类型来允许这样做?就像我可以使用某种 char 字段或二进制字段并“欺骗”django 加入使用它吗?
如果有任何帮助,我正在使用 django-pyodbc。
我有几个通过 SQL Server 中的 GUID 连接的表。现在,我发现了一些自定义字段来添加对 django 中 GUID 的支持,但如果可能的话,我倾向于避免在博客文章中使用代码。除了加入它之外,我不会对 GUID 做任何事情,并且可能会为新条目分配一个 GUID(尽管这是可选的)。有没有办法使用 django 的内置类型来允许这样做?就像我可以使用某种 char 字段或二进制字段并“欺骗”django 加入使用它吗?
如果有任何帮助,我正在使用 django-pyodbc。
我会创建一个基本的 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 作为主键而不是自动增量整数。
看看 Django-extensions UUID Field
老问题,但对于任何使用 Django 1.8+ 的人来说,内置的UUIDField可能会派上用场。
如果我做一个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')
这似乎有效,但速度非常缓慢。
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
对于那些真正需要生成 GUID 的人:
guid = hashlib.sha1(str(random.random())).hexdigest()