چگونه uuid را مدل ایجاد کنیم

در مدل جنگو برای آنکه به جای id که مقداری primary استفاده کنیم می‌توانیم از uuid استفاده کنیم که کلیدی تصادفی است که براساس زمان سیستم و MAC و سخت افزار سیستم شما ساخته می‌شود این کد باعث می‌شود که در آدرس سایت اعداد ID که پشت سرهم هستند ظاهر نشوند و نشود با اضافه کردن مقداری به URL شما باعث ایجاد دسترسی به داد‌های حساس شما باشد.


برای این کار کافیه در مدل فیلد آن‌را اضافه کنید


import uuid 
from django.db import models
class MyUUIDModel(models.Model): 
    id = models.UUIDField( 
         primary_key = True, 
         default = uuid.uuid4, 
         editable = False) 
    # other fields 

خب خیلی راحت بود ولی اگر بخواهید از مدل قدیمی استفاده کنید به این مسله بر می‌خورید که چطور این فیلد را اضافه کنید اگر به صورت دستی اضافه کنید مشکلی اساس در MIGRATE خواهید داشت UUID فیلد‌های NULL که دیتابیس شما را دچار مشکل می‌کند. راه حل چیه ؟

این خط را به MIGRATION خود اضافه کنید

def create_uuid(apps, schema_editor):     
Device = apps.get_model('device_app', 'Device')    
 for device in Device.objects.all():         
device.uuid = uuid.uuid4()        
 device.save()





# -*- coding: utf-8 -*
from __future__ import unicode_literals

from django.db import migrations, models
import uuid


def create_uuid(apps, schema_editor):
    Device = apps.get_model('device_app', 'Device')
    for device in Device.objects.all():
        device.uuid = uuid.uuid4()
        device.save()


class Migration(migrations.Migration):

    dependencies = [
        ('device_app', 'XXXX'),
    ]

    operations = [
        migrations.AddField(
            model_name='device',
            name='uuid',
            field=models.UUIDField(blank=True, null=True),
        ),
        migrations.RunPython(create_uuid),
        migrations.AlterField(
            model_name='device',
            name='uuid',
            field=models.UUIDField(unique=True)
        )
    ]