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