Есть ли способ использовать GUID в django?
У меня есть пара таблиц, к которым присоединяются GUID в SQL Server. Теперь я нашел несколько настраиваемых полей, чтобы добавить поддержку GUID в django, но я стараюсь избегать использования кода в сообщениях в блоге, если это вообще возможно. Я не собираюсь ничего делать с GUID, кроме как присоединиться к нему, и, возможно, назначить GUID для новых записей (хотя это необязательно). Есть ли способ разрешить это с помощью встроенных типов django? Как я могу использовать какое-то поле char или двоичное поле и "трюк" django для соединения с ним?
Если это поможет, я использую django-pyodbc.
Ответы
Ответ 1
Я бы создал базовую модель 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 в качестве первичных ключей вместо целых чисел с автоинкрементами.
Ответ 2
Взгляните на Django-extensions Поле UUID
Ответ 3
Старый вопрос, но для любого, кто использует Django 1.8+, встроенный UUIDField может пригодиться.
Ответ 4
Если я делаю 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')
Кажется, что это работает, но очень медленно.
Ответ 5
Для тех, кто действительно должен генерировать GUID:
guid = hashlib.sha1(str(random.random())).hexdigest()