2013-09-23 13 views
6

Kiedy tworzę obiekty factory_boy, obiekt nie ma klucza głównego i nie jestem pewien dlaczego. Oto mój model i fabryczne:obiekty factory_boy wydają się brakować kluczy podstawowych

# models.py 
from django.db import models 
from django.contrib.auth.models import User 

class UserProfile(models.Model): 
    # UserProfile is a subset table of User. They have a 1:1 relationship. 
    user = models.ForeignKey(User, unique=True) 
    gender = models.CharField(max_length=1) 

# factories.py 
import factory 
from django.contrib.auth.models import User 
from .models import UserProfile 

class UserFactory(factory.Factory): 
    FACTORY_FOR = User 
    username = 'jdoe' 

class UserProfileFactory(factory.Factory): 
    FACTORY_FOR = UserProfile 
    user = factory.lazy_attribute(lambda a: UserFactory()) 
    gender = 'M' 

Teraz według factory_boy documentation o stowarzyszeniach, jeśli utworzyć instancję użytkownika, powinienem dostać pole „id”. Jednak nie. To, co mam (w tłumacza):

>>> from app.factories import UserFactory, UserProfileFactory 
>>> user = UserFactory() 
>>> user.username # This result is correct 
'jdoe' 
>>> user.id is None # User should be 'saved' and so this should return False 
True 

Podobnie:

>>> user_profile = UserProfileFactory() 
>>> user_profile.gender # This is OK 
'M' 
>>> user_profile.user  # This is OK 
<User: jdoe> 
>>> user_profile.id is None # Why isn't this False? 
True 

Dokumentacja mówi te user.id i user_profile.id polecenia powinny powrócić „Fałsz” zamiast „Prawda”, ponieważ Tworzę (w przeciwieństwie do budowania) instancje factory_boy. Czego tu mi brakuje? Dlaczego nie otrzymuję wartości "id" podczas tworzenia tych instancji? Wydaje się, że jedynym sposobem uzyskania identyfikatora jest jawne utworzenie atrybutu "id" w moich fabrykach. Jednak nie widzę tego w żadnym miejscu w dokumentacji, więc nie sądzę, że to właśnie powinieneś zrobić.

Dzięki.

Odpowiedz

15

Dla Django obsługują trzeba użyć DjangoModelFactory:

https://factoryboy.readthedocs.org/en/latest/orms.html#the-djangomodelfactory-subclass

+1

Dzięki, mariodev. Mogę dodać, dla dobra innych, niż przykładowy kod pod powyższym linkiem wydaje się być niepoprawny. Jeśli powiesz "FACTORY_FOR =" myapp.User ", otrzymasz komunikat o błędzie:" AttributeError: obiekt "str" ​​nie ma atrybutu "object". "Nie powinieneś umieszczać cytatów wokół myapp.User. – William

+0

Ten problem rok temu rozwiązałem tę odpowiedź, wróciłem, po tym, jak walczyłem z tym w innym projekcie, i zobaczyłem, że już was daję +1. –

4

Dla kompletności, to również warto zauważyć, że w celu wyraźnie ratować fabrykę do bazy danych, dokumentacja mówi, że może zastosowanie:

user = UserProfile.create() 

która robi to samo, co kiedyś następujące używasz podklasę DjangoModelFactory:

user = UserProfile() 

Tylko wtedy, gdy obiekty zostaną zapisane w bazie danych, otrzymają PK.

Aby utworzyć fabrykę i wyraźnie nie zapisać go do bazy danych, należy użyć:

user = UserProfile.build() 
Powiązane problemy