gpt4 book ai didi

python - 具有 OneToOne 关系和相关领域的 django factory boy factory

转载 作者:太空狗 更新时间:2023-10-29 17:32:25 27 4
gpt4 key购买 nike

我正在使用 Factory Boy为我的 Django 应用程序创建测试工厂。我遇到问题的模型是一个非常基本的帐户模型,它与 django 用户身份验证模型(使用 django < 1.5)具有 OneToOne 关系:

# models.py
from django.contrib.auth.models import User
from django.db import models

class Account(models.Model):
user = models.OneToOneField(User)
currency = models.CharField(max_length=3, default='USD')
balance = models.CharField(max_length="5", default='0.00')

这是我的工厂:

# factories.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User

import factory

from models import Account


class AccountFactory(factory.django.DjangoModelFactory):
FACTORY_FOR = Account

user = factory.SubFactory('app.factories.UserFactory')
currency = 'USD'
balance = '50.00'

class UserFactory(factory.django.DjangoModelFactory):
FACTORY_FOR = User

username = 'bob'
account = factory.RelatedFactory(AccountFactory)

所以我希望工厂男孩在调用 AccountFactory 时创建一个相关的 UserFactory:

# tests.py 
from django.test import TestCase

from factories import AccountFactory

class AccountTest(TestCase):

def setUp(self):
self.factory = AccountFactory()

def test_factory_boy(self):
print self.factory.id

然而,在运行测试时,似乎正在创建多个用户模型,并且我看到了一个完整错误:

IntegrityError: column username is not unique

文档确实提到在处理循环导入时注意循环,但我不确定这是怎么回事,也不确定我将如何补救。 docs

如果任何熟悉 Factory Boy 的人可以插话或提供一些关于可能导致此完整性错误的见解,我们将不胜感激!

最佳答案

我相信这是因为您在工厂定义中有一个循环引用。尝试从 UserFactory 定义中删除 account = factory.RelatedFactory(AccountFactory) 行。如果您总是要通过 AccountFactory 调用帐户创建,那么您不需要这一行。

此外,您可以考虑将一个序列附加到名称字段,这样如果您确实需要多个帐户,它会自动生成它们。

更改:username = "bob"username = factory.Sequence(lambda n : "bob {}".format(n)) 并且您的用户将是命名为“bob 1”、“bob 2”等。

关于python - 具有 OneToOne 关系和相关领域的 django factory boy factory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17551635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com