Django में कई वस्तुओं को एक साथ कई वस्तुओं को जोड़ने के लिए कैसे?


185

Django के दस्तावेज़ के आधार पर, मुझे एक से कई वस्तुओं को पास करने में सक्षम होना चाहिए ताकि एक कई रिश्ते से जोड़ा जा सके लेकिन मैं एक

* टाइपर्रोर: अस्वाभाविक प्रकार: 'सूची'

जब मैं एक सूची में डाली गई django क्वेरी को पास करने का प्रयास करता हूं। Queryset या ValuesListQueryset को पास करना भी फेल लगता है। क्या लूप के लिए उपयोग करने से बेहतर तरीका है?

जवाबों:


320

उपयोग: प्रलेखनobject.m2mfield.add(*items) में वर्णित के रूप में :

add() तर्कों की एक मनमानी संख्या को स्वीकार करता है, उनकी सूची नहीं।

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

उस सूची को तर्कों में विस्तारित करने के लिए, उपयोग करें *

add(*[obj1, obj2, obj3])

परिशिष्ट:

Django obj.save()प्रत्येक आइटम के लिए कॉल नहीं करता है bulk_create(), लेकिन इसके बजाय उपयोग करता है ।


यदि आप प्रबंधक को देखते हैं तो यह वस्तुओं पर लूप के लिए करता है और उन पर कॉल सेव करता है।
सैम डोलन

3
शेल का एक छोटा प्रयोग बताता है कि @sdolan वास्तव में (वर्तमान में) गलत है। Ie जब मैं उत्पन्न SQL को देखता हूं तो मुझे केवल एक ही सम्मिलित विवरण दिखाई देता है: INSERT INTO app_one_twos (one_id, two_id) VALUES (1, 1), (1, 2), (1, 3) (1, 4); यह Django 1.4 में है।
कालस वैन स्केलवेन

@ कालासनस्वेल्वेन: मुझे यह उत्पन्न चक्र के माध्यम से परीक्षण करने की याद नहीं है, लेकिन मेरी टिप्पणी के आधार पर मुझे पूरा यकीन है कि मैंने स्रोत कोड पर एक नज़र डाल ली है। ध्यान रखें कि यह 2 साल पहले था, इसलिए मुझे उम्मीद है कि चीजों को थोड़ा अनुकूलित किया गया था।
सैम डोलन

1
@sdolan नहीं उन्होंने इसमें सुधार नहीं किया है। मैं अभी इसका परीक्षण कर रहा था।
सरसंघ महापात्र

1
किसी भी तरह से यह करने के लिए मूल्य (पूर्व आईडी)? कभी-कभी आपके पास ऑब्जेक्ट्स की सूची नहीं होती है, लेकिन ऑब्जेक्ट वैल्यूज़ (यानी आईडी) की एक सूची होती है? सभी वस्तुओं को दूसरी सूची में शामिल करने और हथियाने के बजाय ...
DannyMoshe

48

जोड़ने के लिए, यदि आप उन्हें किसी क्वेरी से जोड़ना चाहते हैं

उदाहरण

# 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)

से: ManytoManyfield में क्वेरी परिणाम सम्मिलित करें


3
यह दो प्रश्नों को एक के बजाय करता है :(
डायलनयुंग

2
ध्यान दें कि आपको इसे सूची में बदलने की आवश्यकता नहीं है। सीधे जोड़ें (* अनुमतियाँ)।
BjornW

34

Django 1.9 कई-कई संबंधों को जोड़ने के लिए अतिरिक्त तरीके जोड़ता है।

प्रलेखन: https://docs.djangoproject.com/en/dev/ref/models/relations/#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पुराने Djangos में असाइनमेंट के माध्यम से काम करता था e.related_set.set(new_list)। उन्हें बस एहसास हुआ कि "स्पष्ट रूप से निहित से बेहतर है"।
डायलनयुंग

1
सावधानी: संक्षिप्त होने के लिए, सेट सभी मौजूदा संबंधित मॉडलों को हटा देता है। इसलिए यदि आप नई वस्तुओं की सूची जोड़ना चाहते हैं और मौजूदा एक को बरकरार रखना चाहते हैं, तो ऐड (* नई सूची) का उपयोग करें
हुसैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.