ManyToMany फ़ील्ड में डेटा कैसे जोड़ें?


83

मुझे यह कहीं भी नहीं मिल रहा है, इसलिए आपकी मदद मेरे लिए अच्छी होगी :) यहाँ वह क्षेत्र है:

categories = models.ManyToManyField(fragmentCategory)

FragmentCategory:

class fragmentCategory(models.Model):

        CATEGORY_CHOICES = (
                        ('val1', 'value1'),
                        ('val2', 'value2'),
                        ('val3', 'value3'),
                        )

        name = models.CharField(max_length=20, choices=CATEGORY_CHOICES)

यहाँ भेजने के लिए फार्म है:

<input type="checkbox" name="val1" />
<input type="checkbox" name="val2" />
<input type="checkbox" name="val3" />

मैंने कुछ इस तरह की कोशिश की:

categories = fragmentCategory.objects.get(id=1),

या:

categories = [1,2]

जवाबों:


144

इसको समर्पित Django प्रलेखन का एक पूरा पृष्ठ है , अच्छी तरह से सामग्री पेज से अनुक्रमित।

जैसा कि पृष्ठ बताता है, आपको करने की आवश्यकता है:

my_obj.categories.add(fragmentCategory.objects.get(id=1))

या

my_obj.categories.create(name='val1')

15
क्या आपको my_obj.save()अपडेट को बचाने के लिए कॉल करने की आवश्यकता है या यह स्वचालित रूप से किया जाता है?
CpILL

4
@ स्वचालित रूप से किया जाना लगता है। इसे बाहर की कोशिश करो python manage.py shell
रिक्की

1
इस दस्तावेज़ के रूप में आपको कॉल की आवश्यकता है। यह भी देखें: docs.djangoproject.com/en/2.2/topics/db/examples/many_to_many/…
mehdi

4
@mehdi आपको केवल पहली बार सेव करने के लिए कॉल करने की आवश्यकता है जो आप ऑब्जेक्ट को कई से कई फ़ील्ड में बनाते हैं ताकि इसे एक प्राथमिक कुंजी मिल जाए। उसके बाद व्यवहार यह है कि आप बचत के बिना जोड़ सकते हैं।
युंगगुन

5

यदि कोई अन्य व्यक्ति समाप्त हो जाता है, तो व्यवस्थापन को अनुकूलित करने के लिए संघर्ष कर रहे हैं, तो कई व्यवहार को बचाने के लिए, आप self.instance.my_m2m.add(obj)अपने ModelForm.saveओवरराइड में कॉल नहीं कर सकते हैं, क्योंकि ModelForm.saveबाद में आपके m2m को पॉप्युलेट करता है self.cleaned_data['my_m2m']जिससे आपके परिवर्तन अधिलेखित हो जाते हैं। इसके बजाय कॉल करें:

my_m2ms = list(self.cleaned_data['my_m2ms'])
my_m2ms.extend(my_custom_new_m2ms)
self.cleaned_data['my_m2ms'] = my_m2ms

(आने वाली क्वेरीसेट को सूची में परिवर्तित करना ठीक है - ManyToManyFieldवैसे भी।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.