জংগোতে প্রচুর পরিমাণে মডেল অবজেক্ট তৈরি করুন


90

আমার কাছে ডাটাবেসে সংরক্ষণ করার জন্য প্রচুর অবজেক্ট রয়েছে এবং তাই আমি এটির সাথে মডেল উদাহরণ তৈরি করতে চাই।

জাঙ্গো দিয়ে আমি সমস্ত মডেলের উদাহরণ তৈরি করতে পারি 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()

কীভাবে একটি লেনদেনে সমস্ত বিষয় সংরক্ষণ করতে হয়?


এটা তোলে বল এই জন্য একটি ফিক্স বাস্তবায়নের উপর ঘূর্ণায়মান হয় বলে মনে হয় code.djangoproject.com/ticket/19527
Danh

4
list.save_all- এর জন্য ভাবছেন? আপনি প্রায় নিজেকে উত্তর দিতে পারতেন যে এই বিস্ময়কর কথাটি এবং আপনার বিষয় প্রশ্ন থেকে 2 প্রথম শব্দ ব্যবহার করুন words
সাওওমির লেনার্ট

উত্তর:


95

জ্যাঙ্গো বিকাশ bulk_createহিসাবে, একটি অবজেক্ট ম্যানেজার পদ্ধতি হিসাবে উপস্থিত রয়েছে যা শ্রেণি নির্মাতা ব্যবহার করে তৈরি করা বস্তুর একটি অ্যারে ইনপুট হিসাবে গ্রহণ করে। জাঙ্গো ডক্স পরীক্ষা করে দেখুন


12
জ্যাঙ্গোর ডক্স এর জন্য bulk_create: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
জেন

4
তবে মনে রাখবেন বাল্ক_ক্রিয়েটের কিছু সীমাবদ্ধতা রয়েছে যেমন এটি যদি কোনও অটোফিল্ড হয় যা প্রাথমিক কীগুলি তৈরি করে না যা সংরক্ষণ করে () স্বয়ংক্রিয়ভাবে করে।
হিতেশ গার্গ

@ হিটেশগার্গ, এখনকার দিনগুলিতে এখনও কি এটি সত্য?
রায়ডেল মিরান্ডা

4
@ রায়ডেল মিরান্ডা, হ্যাঁ এটি এখনও সত্য। ডকুমেন্টেশনে এটি ঠিক আছে:If the model’s primary key is an AutoField it does not retrieve and set the primary key attribute, as save() does, unless the database backend supports it (currently only PostgreSQL).
ইন্টারডিস্ট

4
ব্যবহার জ্যাঙ্গো 3.0.x এবং আমি নিশ্চিত করছি যে ব্যবহার bulk_create()কোন সংকেত ট্রিগার নেই। আমি ভাবছি কেন.
enchance

42

bulk_create()পদ্ধতি ব্যবহার করুন । এটি এখন জ্যাঙ্গোতে স্ট্যান্ডার্ড।

উদাহরণ:

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

4
জ্যাঙ্গো ১.১০ তে পরিবর্তিত হয়েছে: পোস্টগ্র্রেএসকিউএল ব্যবহার করার সময় বাল্ক_ক্রিয়েট () ব্যবহার করে তৈরি করা সামগ্রীতে প্রাথমিক কী সেট করার জন্য সমর্থন যুক্ত করা হয়েছিল।
ইলাদ রৌপ্য

4

লুপের জন্য ম্যানুয়াল লেনদেন হ্যান্ডলিংটি ব্যবহার করার জন্য আমার পক্ষে কাজ করেছে (9.1 পোস্টগ্রেস):

from django.db import transaction
with transaction.commit_on_success():
    for item in items:
        MyModel.objects.create(name=item.name)

বাস্তবে এটি 'নেটিভ' ডাটাবেস বাল্ক সন্নিবেশ হিসাবে একই নয়, তবে এটি আপনাকে পরিবহন / orms অপারেশন / স্কয়ার কোয়েরি এড়াতে মঞ্জুরি দেয়


4
এটি কিছুটা বদলে গেল। এখন লেনদেনের commit_on_successআর নেই। আপনি ব্যবহার করা উচিত transaction.atomic(): দেখুন stackoverflow.com/questions/21861207/...
t_io

4

কলাম-বিচ্ছিন্ন ফাইল থেকে কীভাবে সত্ত্বা বাল্ক-তৈরি করা যায় তা সমস্ত আনকোটিং এবং আন-এস্কেটিং রুটিনকে একদিকে রেখে:

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)

3

একটি একক লাইন প্রয়োগের জন্য, আপনি একটি মানচিত্রে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করতে পারেন

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

এখানে, ল্যাম্বদা আইটেম তালিকার প্রতিটি আইটেমকে x এর সাথে মেলে এবং প্রয়োজনে ডাটাবেস রেকর্ড তৈরি করুন।

লাম্বদা ডকুমেন্টেশন


আপনি সম্ভবত যে উল্লেখ করতে চান lambdaকরা হয়েছে mapউপর PED items:map(lambda name: MyModel.objects.get_or_create(name = name), items)
মনোজ গোবিন্দন

জা, আমি অন্যভাবে বলার চেষ্টা করি (:
ফলেনএঞ্জেল

2

তৈরি ব্যবহার করে নতুন আইটেমের জন্য একটি ক্যোয়ারী তৈরি করবে। আপনি যদি INSERT ক্যোয়ারির সংখ্যা হ্রাস করতে চান তবে আপনাকে অন্য কিছু ব্যবহার করতে হবে।

স্নিপেটটি বেশ পুরাতন হলেও, বাল্ক সন্নিবেশ স্নিপেট ব্যবহার করে আমি কিছুটা সাফল্য পেয়েছি। এটি আবার কাজ করতে সম্ভবত কিছু পরিবর্তন প্রয়োজন।

http://djangosnippets.org/ স্নিপেটস / 446/


2

বাল্কপস মডিউলটিতে এই ব্লগ পোস্টটি দেখুন ।

আমার জ্যাঙ্গো ১.৩ অ্যাপে আমি উল্লেখযোগ্য গতিসম্পন্ন করেছি।


-19

সবচেয়ে সহজ উপায় হ'ল createম্যানেজার পদ্ধতিটি ব্যবহার করা , যা একক পদক্ষেপে অবজেক্টটি তৈরি করে এবং সংরক্ষণ করে।

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

+1 যদি nameঅদ্বিতীয় এবং সদৃশ ইনপুট সম্ভব তারপর এটি একটি ভাল ধারণা ব্যবহার করতে হবে get_or_create
মনোজ গোবিন্দন

16
কিভাবে এই প্রশ্নের উত্তর দেয়? Model.objects.create অবজেক্ট = মোমোডেল (..) অবজেক্ট.স্যাভ () এর সমতুল্য। আর এই এক লেনদেন এটা করতে না ...
অটোম্যাজিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.