2012-05-29 14 views
10

मैं Django bulk_create पर पढ़ रहा था और उसकी "खामियों" के कुछ:विदेशी कुंजी में Django bulk_create वस्तुओं का उपयोग करना?

" 
This has a number of caveats though: 

1. The model's save() method will not be called, and the pre_save and post_save signals will not be sent. 
2. It does not work with child models in a multi-table inheritance scenario. 
3. If the model's primary key is an AutoField it does not retrieve and set the primary key attribute, as save() does. 
" 

मैं पूरी तरह से यह समझ में नहीं आया।

objList = [a, b, c,] #none are saved 
model.objects.bulk_create(objList) 

मैं अभी भी विदेशी कुंजी में इन वस्तुओं ठीक इस्तेमाल कर सकता: तो अगर मैं वस्तुओं की एक सूची है, यह bulk_create में पारित?

for obj in objList: 
    o = otherModel(something='asdfasdf', fkey=obj) 
    o.save() # will this be fine given the caveats stated above? 

तो क्या विदेशी संबंध संबंध ठीक रहेगा? इसके अलावा जब यह 2 कहता है। यह बहु-तालिका विरासत परिदृश्य में बाल मॉडल के साथ काम नहीं करता है, इसका मतलब है कि किसी अन्य मॉडल (सार या नहीं) से प्राप्त कोई भी मॉडल bulk_create का उपयोग नहीं कर सकता है?

उत्तर

2

पहले प्रश्न के लिए, आप ऐसा करने में सक्षम नहीं होंगे, क्योंकि obj में इसका प्राथमिक कुंजी सेट नहीं होगा, इसलिए इसे विदेशी कुंजी के रूप में उपयोग नहीं किया जा सकता है।

दूसरा प्रश्न, ऐसा नहीं है कि यह बिल्कुल क्या कहता है। यह विशेष रूप से "बहु-टेबल विरासत" का उल्लेख करता है: एक अमूर्त मॉडल से विरासत बहु-तालिका विरासत नहीं है।

+0

तो मैं विदेशी कुंजी संबंधों को कैसे संभालेगा? क्या मुझे केवल उन वस्तुओं को चुनने के लिए डेटाबेस से पूछताछ करना है जिन्हें मैंने अभी डाला है? – Derek

+0

आपको शायद अपने मामले में 'bulk_create' से पूरी तरह से बचाना चाहिए। बस वस्तुओं को अलग-अलग बनाएं। –

+7

फिर व्यक्तिगत प्रदर्शन करने के साथ प्रदर्शन समस्याओं को संभालने की सलाह कैसे देते हैं? – Derek

5

आईडी को मैन्युअल रूप से सेट करने का प्रयास करें। दौड़ की स्थितियों को रोकने के लिए, फ़ंक्शन को एक ही लेनदेन के रूप में लपेटना सुनिश्चित करें।

from django.db import transaction, models 

@transaction.commit_on_success 
def bulk_create_with_manual_ids(foo_list): 
    id_start = (Foo.objects.all().aggregate(models.Max('id'))['id__max'] or 0) + 1 
    for i,foo in enumerate(foo_list): foo.id = id_start + i 
    return Foo.objects.bulk_create(foo_list) 

objList = [Foo(),Foo(),Foo()] 
foo_objects = bulk_create_with_manual_ids(objList) 
Bar(foo=foo_objects[0]).save() 

ध्यान दें कि इस दृष्टिकोण एक serial क्षेत्र या किसी भी ऐसे तालिका के लिए अनुपयुक्त है अन्य ऑटो बढ़ाने में डेटाबेस जनरेट की गई कुंजी। थोक निर्माण द्वारा कुंजी को बढ़ाया नहीं जाएगा क्योंकि Django पक्ष पर आईडी उत्पन्न की जा रही हैं।

+0

यह बदसूरत है, लेकिन यह काम करता है! –

+0

क्या कोई भी लेन-देन किसी भी दौड़ की स्थिति से बचने के लिए पर्याप्त है? क्या यह पूरी तरह से सुरक्षित है? – kissgyorgy

+3

मैंने ऊपर उठाया है लेकिन मुझे डाउनवॉटेड होना चाहिए था! आईडी फ़ील्ड डेटाबेस में autoincrement नहीं है। यह एक बड़ी समस्या है। –

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