Генерация нового уникального uuid4 в Django для каждого объекта класса Factory
У меня есть модель сектора, которая имеет поле id (pk), которое имеет тип UUID4. Я пытаюсь заполнить эту таблицу (Sector Model), используя faker и factory_boy.
Но,
DETAIL: Key (id)=(46f0cf58-7e63-4d0b-9dff-e157261562d2) already exists.
Это ошибка, которую я получаю.
Возможно ли, что ошибка связана с тем, что каждый раз, когда я создаю объекты SectorFactory (который находится в другом приложении django), семя сбрасывается на какое-то предыдущее число, что приводит к повторению uuid?
Пожалуйста, предложите несколько способов, как мне получить уникальный uuid для каждого объекта Factory?
Класс SectorFactory
import uuid
from factory.django import DjangoModelFactory
from factory.faker import Faker
from factory import Sequence
class SectorFactory(DjangoModelFactory):
id = uuid.uuid4()
name = Sequence(lambda n: f'Sector-{n}')
class Meta:
model = 'user.Sector'
django_get_or_create = ['name']
Сектор класса
class Sector(models.Model):
id = models.UUIDField(primary_key=True, default = uuid.uuid4, editable=False)
name = models.CharField(max_length=100)
class Meta:
db_table = 'sector'
constraints = [
models.UniqueConstraint('name', name = 'unique_sector_name')
]
Сценарий, который создает пользовательскую команду для создания объектов SectorFactory.
from types import NoneType
from django.core.management.base import BaseCommand
from user.factories import SectorFactory
class Command(BaseCommand):
help = 'Generate fake data and seed the models with them.'
def add_arguments(self, parser) -> None:
parser.add_argument( '--amount', type=int, help='The amount of fake objects to create.' )
def _generate_sectors(self, amount):
for _ in range(amount):
SectorFactory()
def handle(self, *args, **options) :
amount = options['amount']
if(type(amount) == NoneType): amount = 10
self._generate_sectors(amount)
Что ж, решение было довольно тривиальным и довольно невежественным с моей стороны!
Вместо использования модуля uuid необходимо использовать провайдер uuid4 от Faker.
Но мне все еще интересно, почему использование модуля uuid (который создан исключительно для генерации uuid(ов)) не сработало.
просто используйте следующим образом:
class SectorFactory(DjangoModelFactory):
id = Faker('uuid4')
name = Sequence(lambda n: f'Sector-{n}')
class Meta:
model = 'user.Sector'
django_get_or_create = ['name']