জ্যাঙ্গোতে একবারে কীভাবে একাধিক অবজেক্টস ম্যান্টিটোম্যানের সাথে যুক্ত করবেন?


183

জাঙ্গো ডকের উপর ভিত্তি করে, এক সাথে অনেকগুলি সম্পর্কের সাথে যুক্ত হওয়ার জন্য আমার একবারে একাধিক বস্তু পাস করতে সক্ষম হওয়া উচিত তবে আমি একটি পেয়েছি

* প্রকারের ত্রুটি: অনিবার্য প্রকার: 'তালিকা'

যখন আমি একটি তালিকায় কাস্ট করা জ্যাঙ্গো ক্যোয়ারসেটটি পাস করার চেষ্টা করি। একটি ক্যোরিসেট বা মানসমূহের তালিকাগুলি পাস করা ব্যর্থ বলে মনে হয়। লুপের জন্য ব্যবহারের চেয়ে আরও ভাল উপায় কি আছে?

উত্তর:


317

ব্যবহার করুন: ডকুমেন্টেশনেobject.m2mfield.add(*items) বর্ণিত হিসাবে :

add() একটি সালিশী সংখ্যক আর্গুমেন্ট গ্রহণ করে, তাদের তালিকা নয়।

add(obj1, obj2, obj3, ...)

যুক্তিগুলিতে সেই তালিকাটি প্রসারিত করতে, ব্যবহার করুন *

add(*[obj1, obj2, obj3])

সংযোজন:

জ্যাঙ্গো obj.save()প্রতিটি আইটেমের জন্য কল না করে bulk_create()পরিবর্তে ব্যবহার করে।


আপনি যদি ম্যানেজারের দিকে লক্ষ্য করেন তবে এটি কেবলমাত্র বস্তুর উপর লুপের জন্য কাজ করে এবং কলগুলি সেভ করে।
স্যাম ডোলান

3
শেল থেকে একটি সংক্ষিপ্ত পরীক্ষা দেখায় যে @ এসডোলন আসলে (বর্তমানে) ভুল। আমি যখন উত্পন্ন এসকিউএল দেখি তখন আমি কেবল একটি সন্নিবেশ বিবৃতি দেখতে পাই: INSERT INTO app_one_twos (one_id, two_id) ভ্যালু (1, 1), (1, 2), (1, 3), (1, 4); এটি জ্যাঙ্গো ২.৪ এ রয়েছে।
ক্লাস ভ্যান শেলভেন

@ ক্লাসওয়ানশেলভেন: উত্পন্ন স্কয়ারের মাধ্যমে এটি পরীক্ষা করা আমার মনে নেই তবে আমার মন্তব্যের ভিত্তিতে আমি নিশ্চিত যে আমি উত্স কোডটিতে কেবল এক নজরে দেখেছি। মনে রাখবেন যে এটি 2 বছর পূর্বে ছিল, তাই আমি আশা করব যে বিষয়গুলি কিছুটা অনুকূল হয়েছিল।
স্যাম ডোলান

1
@sdolan না তারা এটি উন্নতি করতে পারে নি। আমি ঠিক এটি পরীক্ষা করছিলাম।
সরশ মহাপাত্র

1
মান দ্বারা এটি করার কোনও উপায় (উদাহরণস্বরূপ আইডি)? কখনও কখনও আপনার কাছে অবজেক্টের তালিকা থাকে না তবে বস্তুর মানগুলির (যেমন আইডির) তালিকা থাকে? সমস্ত বস্তুকে অন্য তালিকায় নিয়ে যাওয়ার পরিবর্তে ...
ড্যানিমোশে

47

যোগ করতে, আপনি যদি কোনও ক্যুরিসেট থেকে এগুলি যুক্ত করতে চান

উদাহরণ

# Returns a queryset
permissions = Permission.objects.all()

# Add the results to the many to many field (notice the *)

group = MyGroup.objects.get(name='test')

group.permissions.add(*permissions)

থেকে: ম্যান্টোম্যানফিল্ডে ক্যোরিসেট ফলাফল সন্নিবেশ করান


3
এটি একের পরিবর্তে দুটি প্রশ্নের সম্পাদনা করে :(
ডিলানইং

1
মনে রাখবেন যে এটিকে তালিকায় পরিণত করার দরকার নেই। কেবল সরাসরি (* অনুমতি) যুক্ত করুন।
BjornW

34

জ্যাঙ্গো ১.৯ একটি বহু থেকে বহু সম্পর্কের ক্ষেত্রে অতিরিক্ত উপায় যুক্ত করে।

ডকুমেন্টেশন: https://docs.djangoproject.com/en/dev/ref/models/references/#django.db.models.fields.related.RelatedManager.set

set একটি নতুন নব্বইটি:

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set.set(new_list)

2
setআমি মনে করি সবসময় ছিল। এটি ঠিক যে এটি e.related_set = new_listপুরানো জাঙ্গোসগুলিতে অ্যাসাইনমেন্টের মাধ্যমে কাজ করত তার সমতুল্য e.related_set.set(new_list)। তারা কেবল বুঝতে পেরেছিল যে "স্পষ্টতই অন্তর্নিহিতের চেয়ে ভাল"।
ডিলান ইয়ং

1
সাবধানতা: সংক্ষিপ্ত হওয়ার জন্য, সেটটি বিদ্যমান বিদ্যমান সমস্ত মডেল মুছে দেয়। সুতরাং আপনি যদি নতুন অবজেক্টের তালিকা যুক্ত করতে চান এবং বিদ্যমান একটি অক্ষত রাখতে চান তবে অ্যাডটি ব্যবহার করুন (* নতুন তালিকা)
তাসওয়ার হুসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.