2017-09-27 9 views
0

도서관 공장 소년의 외래 키에 문제가 있습니다. 내 테스트가 실행되지 않습니다 외래 키의 문제라고 생각합니다.공장 소년과 django 테스트 외래 키가 작동하지 않습니다

나는

class Task(models.Model): 
    title = models.CharField(max_length=255, verbose_name='Заголовок') 
    description = models.CharField(max_length=255, verbose_name='Описание') 
    cost = models.DecimalField(max_digits=7, decimal_places=2, default=0, verbose_name='Цена') 
    assignee = models.ForeignKey('users.User', related_name='assignee', null=True, verbose_name='Исполнитель') 
    created_by = models.ForeignKey('users.User', related_name='created_by', verbose_name='Кем был создан') 

    def __str__(self): 
     return self.title 

처럼 내 코드 모습 내 공장 소년 클래스는

class UserFactoryCustomer(factory.Factory): 

    class Meta: 
     model = User 

    first_name = 'Ahmed' 
    last_name = 'Asadov' 
    username = factory.LazyAttribute(lambda o: slugify(o.first_name + '.' + o.last_name)) 
    email = factory.LazyAttribute(lambda a: '{0}.{1}@example.com'.format(a.first_name, a.last_name).lower()) 
    user_type = 1 
    balance = 10000.00 

class UserFactoryExecutor(factory.Factory): 

    class Meta: 
     model = User 

    first_name = 'Uluk' 
    last_name = 'Djunusov' 
    username = factory.LazyAttribute(lambda o: slugify(o.first_name + '.' + o.last_name)) 
    email = factory.LazyAttribute(lambda a: '{0}.{1}@example.com'.format(a.first_name, a.last_name).lower()) 
    user_type = 2 
    balance = 5000.00 


class TaskFactory(factory.Factory): 

    class Meta: 
     model = Task 

    title = factory.Sequence(lambda n: 'Title {}'.format(n)) 
    description = factory.Sequence(lambda d: 'Description {}'.format(d)) 
    cost = 5000.00 
    assignee = factory.SubFactory(UserFactoryExecutor) 
    created_by = factory.SubFactory(UserFactoryCustomer) 
같은 모습입니다 공장 소년 테스트 방법입니다 user.models에 사용자 모델을 테스트하려고 내 테스트의 예입니다

class ApiModelTestCase(TestCase): 

    def test_creating_models_instance(self): 
     executor = factories.UserFactoryExecutor() 
     customer = factories.UserFactoryCustomer() 
     Task.objects.create(title="Simple Task", description="Simple Description", cost="5000.00", 
          assignee=executor, created_by=customer) 

이 어떻게 내 실수

012입니다
ERROR: test_creating_models_instance (tests.test_models.ApiModelTestCase) 

Traceback (most recent call last): 
    File "/Users/heartprogrammer/Desktop/freelance-with-api/freelance/tests/test_models.py", line 12, in test_creating_models_instance 
    assignee=executor, created_by=customer) 
    File "/Users/heartprogrammer/Documents/envs/freelance/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/Users/heartprogrammer/Documents/envs/freelance/lib/python3.6/site-packages/django/db/models/query.py", line 394, in create 
    obj.save(force_insert=True, using=self.db) 
    File "/Users/heartprogrammer/Documents/envs/freelance/lib/python3.6/site-packages/django/db/models/base.py", line 763, in save 
    "unsaved related object '%s'." % field.name 
ValueError: save() prohibited to prevent data loss due to unsaved related object 'assignee'. 

답변

1

이 오류는 양수인 인스턴스가 저장되지 않았 음을 나타냅니다. 이

class ApiModelTestCase(TestCase): 

    def test_creating_models_instance(self): 
     executor = factories.UserFactoryExecutor.create() 
     customer = factories.UserFactoryCustomer.create() 
     Task.objects.create(title="Simple Task", description="Simple Description", cost="5000.00", 
          assignee=executor, created_by=customer) 

업데이트를 시도해보십시오

장고 모델과 함께 작업하는 경우

, 당신은 factory.django.DjangoModelFactory를 사용해야합니다 - 그렇지 않으면 factory_boy는 "간단한 파이썬 객체"접근 방식을 사용합니다. https://github.com/FactoryBoy/factory_boy/issues/329

그래서 factory.django.DjangoModelFactory와 귀하의 옵션을 취득

from factory.django import DjangoModelFactory 

class UserFactoryCustomer(DjangoModelFactory): 

    class Meta: 
     model = User 

    first_name = 'Ahmed' 
    last_name = 'Asadov' 
    username = factory.LazyAttribute(lambda o: slugify(o.first_name + '.' + o.last_name)) 
    email = factory.LazyAttribute(lambda a: '{0}.{1}@example.com'.format(a.first_name, a.last_name).lower()) 
    user_type = 1 
    balance = 10000.00 

class UserFactoryExecutor(DjangoModelFactory): 

    class Meta: 
     model = User 

    first_name = 'Uluk' 
    last_name = 'Djunusov' 
    username = factory.LazyAttribute(lambda o: slugify(o.first_name + '.' + o.last_name)) 
    email = factory.LazyAttribute(lambda a: '{0}.{1}@example.com'.format(a.first_name, a.last_name).lower()) 
    user_type = 2 
    balance = 5000.00 
+0

해야한다. –

+0

내가 도울 수있어서 기쁩니다. – waranlogesh