Есть ли способ использовать GUID в Django? - PullRequest
14 голосов
/ 21 мая 2009

У меня есть несколько таблиц, которые объединены GUID в SQL Server. Теперь я нашел несколько настраиваемых полей для добавления поддержки GUID в django, но я склонен избегать использования кода в сообщениях блога, если это вообще возможно. Я не собираюсь ничего делать с GUID, кроме как присоединиться к нему и, возможно, назначить GUID для новых записей (хотя это необязательно). Есть ли способ разрешить это, используя встроенные типы django? Например, я могу использовать какое-то поле типа char или двоичное поле и «обмануть» django, чтобы присоединиться к нему, используя его?

Если это поможет, я использую django-pyodbc.

Ответы [ 5 ]

16 голосов
/ 16 сентября 2009

Я бы создал базовую модель 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 в качестве первичных ключей, а не с автоинкрементными целыми числами.

8 голосов
/ 05 апреля 2010

Взгляните на Django-расширения Поле UUID

5 голосов
/ 14 декабря 2015

Старый вопрос, но для любого, кто использует Django 1.8+, может пригодиться встроенный UUIDField .

0 голосов
/ 28 августа 2009

Для тех, кому действительно нужно генерировать GUID:

guid = hashlib.sha1(str(random.random())).hexdigest()
0 голосов
/ 22 мая 2009

Если я сделаю 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')

Кажется, это работает, но мучительно медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...