2014-09-16 5 views
1

저장시 외부 서비스 (어떤 방식 으로든 django와 관련 없음)에서 계정 생성을 트리거하는 장고 모델이 있습니다. 테스트를 위해이 계정 생성을 억제하고 싶습니다. 관리자의 save() 메서드를 재정 의하여 거기에서 kwarg를 팝하거나 Non-database field in Django model에 해당하는 모델에 데이터베이스 필드 이외의 속성을 추가하고이를 내 저장 메서드에서 확인할 수 있습니다.데이터베이스가 아닌 필드에 대한 django의 공장 자식

그러나 factoryboy를 사용하여 내 개체를 만들려고 할 때 모델에 실제 필드가 있는지 확인하는 것처럼 보이지만 속성이 필드가 아니기 때문에 충돌이 발생합니다.

class MyModel(models.Model): 
    name = models.CharField() 
    create_external_account = True 
    def save(self, *args, **kwargs): 
     if create_external_account: 
      ... 

class MyModelFactory(factory.django.DjangoModelFactory): 
    class Meta: 
     model = MyModel 
    name = factory.Sequence(lambda n: 'name%d' % n) 
    create_external_account = False 

내가 factoryboy를 통해 이와 같은 추가 매개 변수를 전달할 수있는 방법에 대한 의견이 있으십니까?

답변

1

customize_create 방법을 사용할 수 있습니다.

신호 처리기에서 외부 계정을 만들면 disable signals이 될 수도 있습니다.

+0

올바른 트랙에서 AFAICT를 사용하면 플래그를 설정 또는 해제 할 수 없습니다. 사안 별 사례; 전체 공장에 대해 설정 (또는 설정 해제)해야합니다. 일부 테스트에서는이 플래그를 설정해야 외부 계정이 생성되었는지 확인할 수 있습니다. 나는 두 개의 다른 공장을 만들 수 있다고 생각합니다. 하나는 공장을, 하나는 그렇지 않습니다. – askvictor

1

factory_boycreate()은 모델의 MyModel.objects.create(**kwargs) 메서드를 호출합니다. 당신이 MyModelFactory()을 쓸 때

,이 호출 여기

obj = MyModel(name="name01", create_external_account=False) 
obj.save() 
return obj 

, 당신이 당신의 사용자 정의 필드 처리하기 위해 모델의 __init__ 메소드를 오버라이드 (override) :

class MyModel(django.db.models.Model): 
    def __init__(self, *args, **kwargs): 
     self.create_external_account = kwargs.pop('create_external_account', False) 
     return super(MyModel, self).__init__(*args, **kwargs)