Есть ли способ использовать 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()