2016-10-31 5 views
11

मैंने contrib.contenttypes फ्रेमवर्क का उपयोग करके पर GenericForeignKey पर माइग्रेट किया। ContentType वस्तु मैं डेटा को स्थानांतरित करने की जरूरत है पहुँचने के लिए, मैं इस कोड का इस्तेमाल किया:Django: परीक्षण चलते समय माइग्रेशन के दौरान सामग्री प्रकार

ContentType = apps.get_model('contenttypes', 'ContentType') 

my_model_content_type = ContentType.objects.get(
    app_label='my_app', 
    model='my_model' 
) 

प्रवास काम करता है जब मैं manage.py migrate चलाते हैं, और मैं तो खोल में अद्यतन मॉडल समस्याओं के बिना साथ खेल सकते हैं।

हालांकि, जब मैं manage.py test को चलाने के लिए प्रयास करते हैं, मैं ContentTypes.object.get() लाइन में निम्न त्रुटि मिलती है:

__fake__.DoesNotExist: ContentType matching query does not exist. 

उस समय ContentType.objects.all() के लिए पता कर रहा है एक खाली क्वेरीसमूह देता है।

मैं कोशिश की है मेरी क्वेरी से पहले इस चलाने के लिए (के रूप में एक और उत्तर अतः यहाँ द्वारा निर्देशित), लेकिन कोई लाभ नहीं हुआ:

update_contenttypes(apps.app_configs['contenttypes']) 
update_contenttypes(apps.app_configs['my_app']) 

मैं यह कैसे सुनिश्चित कर सकते हैं कि ContentType पंक्तियों में उस बिंदु पर मौजूद परीक्षण डेटाबेस माइग्रेशन?

उत्तर

4

यह मेरे लिए काम करना समाप्त हो गया है। सबसे पहले, आयात update_contenttypes:

from django.contrib.contenttypes.management import update_contenttypes 

दूसरा, सूची एक निर्भरता के रूप में प्रारंभिक ContentType माइग्रेशन:

:

dependencies = [ 
    ('contenttypes', '0001_initial'), 
    ... 
] 

अंत में, forward प्रवास समारोह में (माइग्रेशन operations में RunPython के माध्यम से लागू)

# Ensure ContentType objects exist at this point: 
app_config = apps.get_app_config('my_app') 
app_config.models_module = app_config.models_module or True 

update_contenttypes(app_config) 

आपको उपरोक्त कोड को एक से अधिकके लिए चलाने की आवश्यकता हो सकती है। आप apps.get_app_configs() और फिर से उपयोग कर सभी app_config ऑब्जेक्ट्स प्राप्त कर सकते हैं।

+1

यह 1.11 में काम नहीं करता है: 'django.contrib.contenttypes.management import update_contenttypes' –

+1

से पहले https://code.djangoproject.com/ticket/28092 create_contenttypes –

+0

के लिए नामित यह Django 1.11 में मेरे लिए काम करता है 'update_contenttypes' का नाम बदल दिया गया। – Franey

संबंधित मुद्दे