2009-05-21 4 views
14

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

Если это какая-то помощь, я использую django-pyodbc.

+0

Почему директором должен быть первичный ключ? Может ли это быть не только индексированный столбец и регулярное поле символов? После первоначального преобразования всех таблиц в «модели» django, добавление любого нового продукта и т. Д. Потребует установки указателя, но у вас будет доступ к другой таблице через внешний ключ django. – drozzy

+0

Я полагаю, что это хороший вопрос. Не думал об этом. :-) –

ответ

16

Я бы создать базовую модель GUID для того, чтобы повторно использовать его свойства для любых других моделей в моих проектах. Наследование модели прекрасно работает с нескольких версий до Django 1.0 и довольно стабильно с Django 1.0.

Создать что-то вроде проекта/общий/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() 

И все должно работать хорошо с GUIDs как первичные ключи вместо целых чисел с автоинкрементами.

+9

Я мог бы предложить использовать модуль uuid python и генерировать новые команды либо с uuid.uuid1(), либо uuid. uuid4(). –

+2

Чтобы этот код работал с формами, вам нужно добавить blank = True в GUIDModel. Это позволяет проверить форму; на самом деле у нас нет пустого руководства, потому что save() гарантирует, что есть значение. – Rich

+10

Разве вы не добавляете 'abstract = True' под' class Meta: 'для GUIDModel; иначе я думаю, что Django будет думать, что все они указывают на центральную таблицу ... –

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') 

Это похоже на работу, но болезненно медленно.

+1

Почему бы не изменить его на CharField (primary_key = True)? – webjunkie

+0

Ах, это работает. Благодарю. –

-3

Для тех, кто на самом деле нужно создать GUIDs:

guid = hashlib.sha1(str(random.random())).hexdigest() 
+3

Ваш ответ почти не связан с вопросом, который был задан, пожалуйста, придерживайтесь ответа на вопрос, а не на предоставление тангенциальной информации. Однако, кроме того, ваш код неверен, поскольку он обеспечивает очень опасный шанс столкновения с GUID. Лучшим вариантом было бы использовать встроенные функции 'uuid.uuid1()' или 'uuid.uuid4()' – Toji

8

Посмотрите на Django-расширений UUID Field

+0

Это старый вопрос, но у меня есть память, как сито. это похоже на ссылку на старый репозиторий Google, а не на ссылку newere github, которую добавил акотиан. – hum3

+1

Хороший звонок @ hum3 Я обновил ссылку на репозиторий github. –

+0

спасибо. Я по-прежнему предпочитаю документацию: – hum3

4

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

+0

Ссылки на новую документацию. Последняя ссылка для разработчиков - [UUIDField] (https://docs.djangoproject.com/en/dev/ref/models/fields/#uuidfield), но, вероятно, должна выглядеть версия. – hum3

Смежные вопросы