在 Django 中为工厂的每个对象生成新的唯一 uuid4 class

Generating new unique uuid4 in Django for each object of Factory class

我有一个模型扇区,它有一个 UUID4 类型的 id 字段 (pk)。 我正在尝试使用 faker 和 factory_boy.

填充 table(Sector Model)

但是,

DETAIL:  Key (id)=(46f0cf58-7e63-4d0b-9dff-e157261562d2) already exists.

这是我遇到的错误。

错误是否可能是由于每次我创建 SectorFactory 对象(在不同的 django 应用程序中)并且种子被重置为以前的某个数字导致 uuid 重复?

请就如何为每个 Factory 对象获取唯一的 uuid 提出一些建议?

扇区工厂class

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 部门

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)

好吧,这个解决方案相当琐碎,而且我对它一无所知!

必须使用 Faker 的 uuid4 提供程序,而不是使用 uuid 模块。

但我仍然想知道为什么使用 uuid 模块(创建的唯一目的是生成 uuid(s))不起作用。

就这样使用:

class SectorFactory(DjangoModelFactory): 
    id = Faker('uuid4')
    name = Sequence(lambda n: f'Sector-{n}')

    class Meta:
        model = 'user.Sector'
        django_get_or_create = ['name']