2010-08-31 13 views
49

में मॉडल ऑब्जेक्ट्स बनाएं डेटाबेस में सहेजने के लिए मेरे पास बहुत सारी ऑब्जेक्ट्स हैं, और इसलिए मैं इसके साथ मॉडल उदाहरण बनाना चाहता हूं।थोक django

django के साथ, मैं MyModel(data) के साथ सभी मॉडल उदाहरण बना सकता हूं, और फिर मैं उन्हें सभी सहेजना चाहता हूं।

for item in items: 
    object = MyModel(name=item.name) 
    object.save() 

अगर मैं सीधे वस्तुओं की एक सूची को बचा सकता है मैं सोच रहा हूँ, उदाहरण के लिए::

objects = [] 
for item in items: 
    objects.append(MyModel(name=item.name)) 
objects.save_all() 

कैसे एक में सभी वस्तुओं को बचाने के लिए

वर्तमान में, मैं ऐसा ही कुछ है लेन-देन?

+0

ऐसा लगता गेंद इस के लिए एक ठीक लागू करने पर चल रहा है https://code.djangoproject.com/ticket/19527 – DanH

+1

list.save_all के लिए सोच रहा है? आप अपने आप को केवल अपने उत्तर प्रश्न का जवाब दे सकते हैं जो सोचते हैं और आपके विषय प्रश्न से 2 पहले शब्दों का उपयोग करते हैं। –

उत्तर

60

Django विकास संस्करण 1.4 के रूप में, वहाँ एक वस्तु प्रबंधक विधि है जो इनपुट ऑब्जेक्ट की श्रृंखला वर्ग निर्माता के रूप में उपयोग कर बनाई गई लेता है के रूप में bulk_create मौजूद है। django दस्तावेज़ों की जांच करें

+11

'थोक_क्रेट' के लिए Django के दस्तावेज़: https://docs.djangoproject.com/en/dev/ref/models/querysets/#bulk-create – funkotron

+1

लेकिन याद रखें कि थोक_क्रेट की कुछ सीमाएं हैं, जैसे कि यह एक ऑटोफिल्ड है जो स्वचालित रूप से सहेजता है ( –

+0

@HiteshGarg, क्या यह अभी भी सच है? –

-17

सबसे आसान तरीका create प्रबंधक विधि का उपयोग करना है, जो ऑब्जेक्ट को एक ही चरण में बनाता है और सहेजता है।

for item in items: 
    MyModel.objects.create(name=item.name) 
+0

+1। यदि 'नाम' अद्वितीय है और डुप्लिकेट इनपुट संभव है तो' get_or_create' का उपयोग करना एक अच्छा विचार होगा। –

+12

यह प्रश्न का उत्तर कैसे देता है? Model.objects.create ऑब्जेक्ट = MoModel (..) object.save() के बराबर है। और यह एक लेनदेन में ऐसा नहीं करता है ... – automagic

2

एक पंक्ति कार्यान्वयन के लिए, आप एक नक्शा

map(lambda x:MyModel.objects.get_or_create(name=x), items) 

यहाँ में एक लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं, लैम्ब्डा एक्स के लिए आइटम सूची में प्रत्येक आइटम से मेल खाता है और आवश्यक होने पर डाटाबेस रिकॉर्ड बनाने के।

Lambda Documentation

+0

आप शायद यह उल्लेख करना चाहते हैं कि 'lambda' को 'आइटम' पर 'मानचित्र' पेड होना चाहिए: 'नक्शा (लैम्ब्डा नाम: MyModel.objects.get_or_create (name = name), आइटम) ' –

+0

जा, मैं एक और तरीका कहने की कोशिश करता हूं (: – FallenAngel

2

बनाने नया आइटम प्रति एक क्वेरी का कारण होगा का उपयोग करना। यदि आप INSERT क्वेरीज़ की संख्या को कम करना चाहते हैं, तो आपको कुछ और उपयोग करने की आवश्यकता होगी।

मुझे थोक सम्मिलन स्निपेट का उपयोग करके कुछ सफलता मिली है, भले ही स्निपेट काफी पुराना हो। शायद इसे फिर से काम करने के लिए कुछ बदलाव आवश्यक हैं।

http://djangosnippets.org/snippets/446/

2

bulkops मॉड्यूल पर इस ब्लॉग पोस्ट को देखें।

मेरे django 1.3 ऐप पर, मैंने महत्वपूर्ण गति का अनुभव किया है।

4

काम किया मुझे (postgres 9.1) पाश के लिए से निपटने के मैनुअल लेन-देन का उपयोग करने के लिए:

from django.db import transaction 
with transaction.commit_on_success(): 
    for item in items: 
     MyModel.objects.create(name=item.name) 
वास्तव में

यह, एक ही नहीं है 'स्थानीय' डेटाबेस थोक डालने के रूप में है, लेकिन यह आप से बचने के लिए/घट गई अनुमति देता है परिवहन/ORMS संचालन/एसक्यूएल क्वेरी लागत का विश्लेषण

2

यहाँ कैसे स्तंभ अलग की गई फ़ाइल से संस्थाओं को बल्क में बनाने के लिए, एक तरफ सभी unquoting और अन-भागने दिनचर्या छोड़ने है:

SomeModel(Model): 
    @classmethod 
    def from_file(model, file_obj, headers, delimiter): 
     model.objects.bulk_create([ 
      model(**dict(zip(headers, line.split(delimiter)))) 
      for line in file_obj], 
      batch_size=None) 
12

bulk_create() विधि का प्रयोग करें।अब यह Django में मानक है: Official Django Documentation bulk_create()

उदाहरण:

>>> Entry.objects.bulk_create([ 
...  Entry(headline="Django 1.0 Released"), 
...  Entry(headline="Django 1.1 Announced"), 
...  Entry(headline="Breaking: Django is awesome") 
... ]) 
+0

Django में बदल गया 1.10: ऑब्जेक्ट्स पर प्राथमिक कुंजी सेट करने के लिए समर्थन PostgreSQL का उपयोग करते समय bulk_create() का उपयोग करके बनाया गया था। –

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