Pertanyaan Hasilkan id unik di Django dari bidang model


Saya ingin menghasilkan id unik / unik per permintaan dalam Django dari bidang model. Saya melakukan ini tetapi saya tetap mendapatkan id yang sama.

class Paid(models.Model):
     user=models.ForeignKey(User)
     eyw_transactionref=models.CharField(max_length=100, null=True, blank=True, unique=True, default=uuid.uuid4()) #want to generate new unique id from this field

     def __unicode__(self):
        return self.user

25
2018-06-04 18:38


asal


Jawaban:


MEMPERBARUI: Jika Anda menggunakan Django 1.8 atau atasan, @madzohan memiliki jawaban yang tepat di bawah ini.


Lakukan seperti ini:

#note the uuid without parenthesis
eyw_transactionref=models.CharField(max_length=100, blank=True, unique=True, default=uuid.uuid4)

Alasannya mengapa karena dengan kurung Anda mengevaluasi fungsi saat model diimpor dan ini akan menghasilkan sebuah uuid yang akan digunakan untuk setiap instance yang dibuat.

Tanpa tanda kurung Anda hanya melewati fungsi yang perlu dipanggil untuk memberikan nilai default ke lapangan dan akan dipanggil setiap kali model diimpor.

Anda juga dapat menggunakan pendekatan ini:

class Paid(models.Model):
     user=models.ForeignKey(User)
     eyw_transactionref=models.CharField(max_length=100, null=True, blank=True, unique=True)

     def __init__(self):
         super(Paid, self).__init__()
         self.eyw_transactionref = str(uuid.uuid4())

     def __unicode__(self):
        return self.user

Semoga ini membantu!


39
2018-06-04 18:41



sejak versi 1.8 Django memiliki UUIDField https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.UUIDField

import uuid
from django.db import models

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

66
2018-06-04 07:31



Jika Anda membutuhkan atau ingin menggunakan fungsi penghasil ID khusus daripada bidang UUID di Django, Anda dapat menggunakan loop sementara di save() metode. Untuk ID unik yang cukup besar, ini hampir tidak akan menghasilkan lebih dari satu panggilan db untuk memverifikasi keunikan:

urlhash = models.CharField(max_length=6, null=True, blank=True, unique=True)

# Sample of an ID generator - could be any string/number generator
# For a 6-char field, this one yields 2.1 billion unique IDs
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

def save(self):
    if not self.urlhash:
        # Generate ID once, then check the db. If exists, keep trying.
        self.urlhash = id_generator()
        while MyModel.objects.filter(urlhash=self.urlhash).exists():
            self.urlhash = id_generator()
    super(MyModel, self).save()

8
2018-05-21 06:46



Jawaban dari Google Code ini berhasil untuk saya:

https://groups.google.com/d/msg/south-users/dTyajWop-ZM/-AeuLaGKtyEJ

menambahkan:

from uuid import UUID

ke file migrasi yang Anda buat.


1
2017-11-06 03:53