2013-09-23 4 views
6

जब मैं factory_boy ऑब्जेक्ट्स बनाता हूं, तो ऑब्जेक्ट में प्राथमिक कुंजी नहीं दिखती है और मुझे यकीन नहीं है कि क्यों। यहाँ मेरी मॉडल और कारखाना है:factory_boy ऑब्जेक्ट्स में प्राथमिक कुंजी की कमी लगती है

# 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' 

अब संघों पर factory_boy documentation के अनुसार, अगर मैं एक उपयोगकर्ता उदाहरण बनाने, मैं कोई 'आईडी' क्षेत्र मिलना चाहिए। हालांकि, मैं नहीं करता। यह वही है मैं (दुभाषिया में) मिलता है:

>>> 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 
इसी

:

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

प्रलेखन इन user.id कहते हैं और user_profile.id आदेशों 'झूठी' के बजाय के बाद से 'ट्रू' लौटना चाहिए मैं फैक्ट्री_बॉय उदाहरणों के निर्माण के रूप में (निर्माण के विरोध में) बना रहा हूं। मुझे यहां क्या समझ नहीं आ रहा है? जब मैं इन उदाहरणों को बनाता हूं तो मुझे 'आईडी' मान क्यों नहीं मिल रहा है? ऐसा लगता है कि एक आईडी प्राप्त करने का एकमात्र तरीका स्पष्ट रूप से मेरे कारखानों में 'आईडी' विशेषता बना रहा है। हालांकि, मुझे यह दस्तावेज में कहीं भी नहीं देखा जाता है, इसलिए मुझे नहीं लगता कि आपको यही करना है।

धन्यवाद।

उत्तर

15

Django के लिए समर्थन आप DjangoModelFactory उपयोग करने की आवश्यकता:

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

+1

धन्यवाद,:

एक कारखाने बनाने के लिए और स्पष्ट रूप से डेटाबेस के लिए यह नहीं बचा, का उपयोग करें। मैं उपरोक्त लिंक पर उदाहरण कोड की तुलना में, दूसरों के लाभ के लिए, जोड़ सकता हूं। यदि आप कहते हैं, "FACTORY_FOR = 'myapp.User', आपको त्रुटि मिल जाएगी:" विशेषता त्रुटि: 'str' ऑब्जेक्ट में कोई विशेषता नहीं है 'ऑब्जेक्ट'। "आपको myapp.User के आसपास उद्धरण नहीं देना चाहिए। – William

+0

इस समस्या को था एक साल पहले, इस जवाब के साथ हल किया गया था। इस परियोजना के साथ संघर्ष करने के बाद, अब वापस आया, और मैंने देखा कि मैंने पहले ही आपको +1 कर दिया है। आखिरकार मैं सीखूंगा! –

4

पूर्णता के लिए के लिए, यह भी ध्यान दें कि आदेश स्पष्ट रूप से डेटाबेस के लिए एक कारखाने को बचाने के लिए फ़ायदेमंद हो सकता प्रलेखन आप कहते हैं कर सकते हैं उपयोग:

user = UserProfile.create() 

जो निम्नलिखित एक बार आप DjangoModelFactory का एक उपवर्ग उपयोग कर रहे हैं के रूप में एक ही बात करता है:

user = UserProfile() 

केवल जब ऑब्जेक्ट डेटाबेस में सहेजे जाते हैं तो वे पीके प्राप्त करते हैं। mariodev

user = UserProfile.build() 
संबंधित मुद्दे