2014-11-11 1 views
2

Как создать поле в Factory-Boy для TaggableManager из django-taggit?Как создать фабрику Factory-Boy для модели с полем TaggableManager

Следующая не работает:

Первое:

class ExperimentFactory(factory.DjangoModelFactory): 
    class Meta: 
     model = Experiment 
     django_get_or_create = ('owner', 'name', 'start_date', 'stop_date',) 

    owner = factory.SubFactory(UserFactory) 
    name = factory.Sequence(lambda n : 'Experiment %s' % n) 

    start_date = fuzzy.FuzzyDate(start_date=datetime.date(2003, 2, 1), 
            end_date = datetime.date.today() + timedelta(days=4*52*7+5)) 

    tags = [u'abc, cde', u'xzy'] 

Ошибка: Ошибка типа: 'метки' является недопустимым аргументом ключевое слово для этой функции

Второе: (с factory.post_generation) , Таким образом, вместо последней строки есть

@factory.post_generation 
def post_tags(self, create, extracted, **kwargs): 
    self.tags = [u'abc, cde', u'xzy'] 
    # self.save() # This does not have any effects 

я получаю в результате по Experiment.objects.get(pk=1).tags является []

Для некоторых деталей:

Испытание объектов в TestCase является:

experiment = ExperimentFactory(owner = self.user) 
saved_experiment = Experiment.objects.get(name=experiment.name) 

self.assertEquals(len(experiment.tags), len(saved_experiment.tags.all())) # AssertError: 2 != 0 
self.assertItemsEqual(experiment.tags, saved_experiment.tags.all()) 

Странно, что в self.experiments теги устанавливаются. Вызывается метод post_tags().

Модель:

class Experiment(models.Model): 
    owner = models.ForeignKey(User, related_name='experiments') 

    name = models.CharField(max_length=32, default='') 
    start_date = models.DateField() 

    tags = TaggableManager() 

ответ

2

, наконец, нашли решение:

@factory.post_generation 
def post_tags(self, create, extracted, **kwargs): 
    self.tags.add(u'abc, cde', u'xzy') 
+2

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего после. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – gunr2171

1

Для кого-то наступающем, кто хочет более обобщенный пример использования Factory Boy и Джанго-taggit, завод Boy docs include a Many-to-Many example который полезен. Итак:

import factory 

from myapp.models import Experiment 


class ExperimentFactory(factory.DjangoModelFactory): 
    class Meta: 
     model = Experiment 

    # other fields here 

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

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

Тогда вы можете сделать:

from myapp.factories import ExperimentFactory 

ExperimentFactory(name='A Name', tags=['Tag 1', 'Tag 2', 'Another tag',]) 

Заметим, что это не будет создавать теги, если вы ExperimentFactory.build(), только если вы ExperimentFactory.create() или его синоним ExperimentFactory().

 Смежные вопросы

  • Нет связанных вопросов^_^