8

Django アプリのフィクスチャを置き換えるために factory_boy を使用しています。多くのオファーとマーチャントが必要な製品モデルがあります。

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

class Merchant(models.Model):
    product = models.ForeignKey(Product)
    name = models.CharField()

class Offer(models.Model):
    product = models.ForeignKey(Product)
    price = models.DecimalField(max_digits=10, decimal_places=2)

複数のマーチャントと複数のオファーを含む製品を作成するファクトリが必要です。

#factories.py
import random
from models import Offer, Merchant, Product

class OfferFactory(factory.django.DjangoModelFactory):
    FACTORY_FOR = Offer

    product = factory.SubFactory(ProductFactory)
    price = random.randrange(0, 50000, 1)/100.0


class MerchantFactory(factory.django.DjangoModelFactory):
    FACTORY_FOR = Merchant

    product = factory.SubFactory(ProductFactory)
    name = factory.Sequence(lambda n: 'Merchant %s' % n)
    url = factory.sequence(lambda n: 'www.merchant{n}.com'.format(n=n))

 class ProductFactory(factory.django.DjangoModelFactory):
    FACTORY_FOR = Product 

    name = "test product"
    offer = factory.RelatedFactory(OfferFactory, 'product')
    offer = factory.RelatedFactory(OfferFactory, 'product') # add a second offer
    offer = factory.RelatedFactory(OfferFactory, 'product') # add a third offer
    merchant = factory.RelatedFactory(MerchantFactory, 'product')
    merchant = factory.RelatedFactory(MerchantFactory, 'product') # add a second merchant
    merchant = factory.RelatedFactory(MerchantFactory, 'product') # add a third merchant

しかし、ProductFactory を使用して製品を作成すると、1 つのオファーと 1 つのマーチャントしかありません。

In [1]: from myapp.products.factories import ProductFactory

In [2]: p = ProductFactory()

In [3]: p.offer_set.all()
Out[3]: [<Offer: $39.11>]

特定のタイプの複数の依存関係を持つように ProductFactory を設定するにはどうすればよいですか?

4

3 に答える 3

2

これを試して:

class ProductFactory(factory.django.DjangoModelFactory):
    FACTORY_FOR = Product 

    name = "test product"

    @classmethod
    def create(cls, **kwargs):
        num = kwargs.pop('offer_num', 1)
        attrs = cls.attributes(create=True, extra=kwargs)
        product = cls._generate(True, attrs)
        for n in range(num)
            OfferFactory(product=product)
        return product

ProductFactory(offer_num=4) これにより、4 つの関連オファーが作成されます。

于 2014-04-02T07:08:02.970 に答える