你能覆盖 factory_boy 的模型函数吗?

拉胡尔·萨尔玛

我正在为我的模型使用工厂男孩。另一个模型有一个外键,该模型的第一个 obj 用于模型的字符串表示。示例结构:

class A(models.Model):
    ...

    def __str__(self):
    return self.reverseForeignKey_set.first().name

class AFactory(factory.django.DjangoModelFactory):

    class Meta:
        model = models.A

    some_attribute = factory.RelatedFactory(
        ReverseModelFactory,
        'a',
        )

但是当我使用 factory_boy 创建时,它给了我这个错误:

Traceback (most recent call last):
  File "/home/rahul/Documents/projects/healbot_current/healbot/functional_tests/tests.py", line 21, in setUp
    factories.AFactory.create()
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/factory/base.py", line 623, in create
    return cls._generate(True, attrs)
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/factory/base.py", line 554, in _generate
    results[name] = decl.call(obj, create, extraction_context)
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/factory/declarations.py", line 624, in call
    return factory.simple_generate(create, **passed_kwargs)
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/factory/base.py", line 709, in simple_generate
    return cls.generate(strategy, **kwargs)
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/factory/base.py", line 676, in generate
    return action(**kwargs)
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/factory/base.py", line 622, in create
    attrs = cls.attributes(create=True, extra=kwargs)
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/factory/base.py", line 449, in attributes
    utils.log_repr(extra),
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/factory/utils.py", line 142, in log_repr
    return compat.force_text(repr(obj))
  File "/home/rahul/Envs/healbot/lib/python3.6/site-packages/django/db/models/base.py", line 588, in __repr__
    u = six.text_type(self)
  File "/home/rahul/Documents/projects/healbot_current/healbot/diagnosis/models.py", line 57, in __str__
    return self.reverseForeignKey_set.first().name
AttributeError: 'NoneType' object has no attribute 'name'

我能做些什么来解决这个问题吗?喜欢为 factory_boy覆盖模型 A 上str方法?

A.格里年科

你有这样的问题,因为A模型实例比ReverseModel实例更早创建

正如 factory_boy 文档所说:

相关工厂:在构建/创建第一个工厂之后构建或创建给定工厂。

http://factoryboy.readthedocs.io/en/latest/reference.html#post-generation-hooks

首先,您应该创建您ReverseModelA模型实例,然后是您的模型实例。正如 factory_boy 文档在接收中所说:

当一个属性实际上是一个复杂字段(例如,另一个模型的外键)时,使用 SubFactory 声明

因此,您可以为 FK 模型定义一个工厂,并将其定义为 AFactory 中的 SubFactory。

# models.py
class A(models.Model):
    ...

    def __str__(self):
        return self.reverseForeignKey_set.first().name

# factories.py
import factory
from . import models

class ReverseModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.ReverseModel

        # Define your model fields
        attr = factory.Faker('text', max_nb_chars=255)

class AFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.A

    some_attribute = factory.SubFactory(ReverseModelFactory)

在这种情况下,您的 ReverseModelFactory 对象将首先被创建来解决您的问题。有关更多信息,请参阅http://factoryboy.readthedocs.io/en/latest/recipes.html

我还应该注意,如果你想处理 ManyToMany 字段,你应该使用 post_generation 钩子:

# models.py
class Group(models.Model):
    name = models.CharField()

class User(models.Model):
    name = models.CharField()
    groups = models.ManyToManyField(Group)


# factories.py
class GroupFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.Group

    name = factory.Sequence(lambda n: "Group #%s" % n)

class UserFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = models.User

    name = "John Doe"

    @factory.post_generation
    def groups(self, create, extracted, **kwargs):
        if not create:
            # Simple build, do nothing.
            return

        if extracted:
            # A list of groups were passed in, use them
            for group in extracted:
                self.groups.add(group)

有关更多信息,请参阅http://factoryboy.readthedocs.io/en/latest/recipes.html#simple-many-to-many-relationship

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

factory_boy对象似乎缺少主键

来自分类Dev

Django 1.6.5和factory_boy的异常

来自分类Dev

factory_boy:添加几个依赖对象

来自分类Dev

如何从Factory_boy使用Faker

来自分类Dev

使用factory_boy测试Django帖子

来自分类Dev

你能举一个被覆盖的例子吗?

来自分类Dev

禁止factory_boy捕获日志记录信息?

来自分类Dev

factory_boy objects seem to lack primary keys

来自分类Dev

使用pip安装factory_boy时遇到问题

来自分类Dev

在没有`self`的〜Factory子类中调用factory_boy超类方法。

来自分类Dev

多重继承factory_boy工厂-似乎仅继承第一个父级

来自分类Dev

Django:factory_boy的一对一字段:UNIQUE约束失败

来自分类Dev

factory_boy工厂的多重继承-似乎仅继承第一个父级

来自分类Dev

覆盖JS原型函数

来自分类Dev

JavaScript 原型函数覆盖

来自分类Dev

Django Factory Boy模拟模型工厂中的方法

来自分类Dev

Scala或Java相当于Ruby factory_girl或Python factory_boy(用于单元测试的便捷工厂模式)

来自分类Dev

你能简化 for 循环吗?

来自分类Dev

你能保存 Vue 模型的当前状态吗?

来自分类Dev

你能帮我理解盐散列函数吗?

来自分类Dev

你能阻止用户查看你的 Alexa 技能吗?

来自分类Dev

你能更正这个bash吗

来自分类Dev

你能帮我吗

来自分类Dev

你能限制元重新加载吗?

来自分类Dev

你能全局改变 onChange 吗?

来自分类Dev

你能改进 Python 的功能吗?

来自分类Dev

Factory Boy是否可以像Model Mommy一样自动生成Django模型字段值?

来自分类Dev

如何在Django中使用Factory Boy将值传递到依赖模型中?

来自分类Dev

滚动逻辑模型函数