9

factory_boy のデフォルト1はシーケンス用です。代わりに別の開始番号として使用する番号を渡すにはどうすればよいですか? メソッドをサブクラス化することは_setup_next_sequence()できますが、使用する変数を与えるにはどうすればよいでしょうか?

# File: models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)


# File: factories.py
from .models import Book
import factory

class BookFactory(factory.Factory):
  FACTORY_FOR = BookModel  
  title = factory.Sequence(lambda n: u'Title #{}'.format(n))

  @classmethod
  def _setup_next_sequence(cls):      
      # Instead of defaulting to starting with number 1, start with starting_seq_num.
      # But how do I set starting_seq_num?
      return starting_seq_num


# File: make_data.py
from factories import BookFactory

# somehow set starting sequence number here?

BookFactory().create()

factory_boy 1.2.0 (経由pip install factory_boy)
factory_boy コードを使用しています: https://github.com/dnerdy/factory_boy

4

4 に答える 4

8

Rob Bednarkの答えに加えて

カウンターを特定の値にリセットreset_sequence()する関数を使用できます。

# File: make_data.py
import factories

factories.BookFactory.reset_sequence(100)
my_book = factories.BookFactory().create()
print(my_book.title) # Title #100
于 2016-04-07T19:03:01.740 に答える
4

私はこれを解決する2つの方法を見つけました:

  1. モジュール変数を使用する
  2. クラス定義の外部で設定されたクラス属性を使用する

モジュール変数を使用します。

# File: factories.py
from .models import Book
import factory

starting_seq_num = 0

class BookFactory(factory.Factory):
  FACTORY_FOR = BookModel  
  title = factory.Sequence(lambda n: u'Title #{}'.format(n))

  @classmethod
  def _setup_next_sequence(cls):      
      # Instead of defaulting to starting with 0, start with starting_seq_num.
      return starting_seq_num

# File: make_data.py
import factories

factories.starting_seq_num = 100    
factories.BookFactory().create()

クラス定義の外部で設定されたクラス属性を使用します。

# File: factories.py
from .models import Book
import factory

class BookFactory(factory.Factory):
  # Note that starting_seq_num cannot be set here in the class definition,
  # because Factory will then pass it as a kwarg to the model's create() method
  # and cause an exception.  It must be set outside the class definition.
  FACTORY_FOR = BookModel  
  title = factory.Sequence(lambda n: u'Title #{}'.format(n))

  @classmethod
  def _setup_next_sequence(cls):      
      return getattr(cls, 'starting_seq_num', 0)

# File: make_data.py
from factories import BookFactory

BookFactory.starting_seq_num = 100
BookFactory().create()
于 2013-03-14T19:21:07.583 に答える
0

3 番目の最も簡単な方法:

# File: factories.py
from .models import BookModel
import factory

class BookFactory(factory.Factory, starting_seq_num):
  FACTORY_FOR = BookModel  
  title = factory.Sequence(lambda n: u'Title #{}'.format(n + starting_seq_num))

# File: make_data.py
import factories

book = factories.BookFactory(512).create()  #Start with 512

私自身は Factory Boy から始めたばかりで、Python の経験もあまりないので、何かが欠けているかもしれませんが、ここでどこに向かっているのかがわかります。より明確にするために、実際にはキーワードを付けたいと思います:

class BookFactory(factory.Factory, title_seq_start=-1):
...
book = factories.BookFactory(title_seq_start=512).create()
于 2014-10-24T01:32:55.787 に答える