我有几个表在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作为主键而不是自增整数,一切都应该可以很好地工作。
class Meta:
дёӢж·»еҠ abstract = True
пјӣеҗҰеҲҷпјҢжҲ‘и®ӨдёәDjangoдјҡи®Өдёәе®ғ们йғҪжҢҮеҗ‘дёҖдёӘдёӯеӨ®иЎЁ... - Jordan Reiter看一下Django扩展 UUID字段
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
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')
这似乎可行,但速度实在是太慢了。
对于那些实际需要生成 GUID 的人:
guid = hashlib.sha1(str(random.random())).hexdigest()
uuid.uuid1()
或uuid.uuid4()
。 - Toji