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.
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
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. –