2009-02-05 9 views
5

मेरे पास django में कुछ मॉडल हैं जो कई से जुड़े हुए हैं। मैं मेमोरी में इन मॉडलों के उदाहरण बनाना चाहता हूं, उन्हें उपयोगकर्ता (कस्टम-कॉल के माध्यम से कस्टम विधि-कॉल के माध्यम से) प्रस्तुत करें और यदि उपयोगकर्ता संतुष्ट है, तो उन्हें डेटाबेस में सहेजें।django में असुरक्षित कई से अधिक संबंधों के साथ कैसे काम करें?

हालांकि, अगर मैं मॉडल-इंस्टेंस (कॉल रेंडरिंग विधियों, उदाहरण के लिए) पर कुछ भी करने का प्रयास करता हूं, तो मुझे एक त्रुटि संदेश मिलता है जो कहता है कि मुझे पहले उदाहरणों को सहेजना है। दस्तावेज कहता है कि ऐसा इसलिए है क्योंकि मॉडल कई से अधिक रिश्तों में हैं।

मैं उपयोगकर्ता को ऑब्जेक्ट कैसे प्रस्तुत करूं और उसे अपने डेटाबेस को छेड़छाड़ किए बिना उन्हें सहेजने या त्यागने की इजाजत देता हूं?

(मुझे लगता है मैं लेनदेन-हैंडलिंग बंद कर देते हैं सकता है और पूरी परियोजना भर में उन्हें अपने आप करते हैं, लेकिन यह एक संभावित त्रुटि प्रवण उपाय की तरह लगता है ...)

Thx!

उत्तर

4

मुझे लगता है कि this दस्तावेज (एम 2 एम के लिए खोज ...) में उल्लिखित अनुसार django रूपों का उपयोग जवाब हो सकता है।

जो एक ही समस्या हो सकती है अन्य लोगों के लिए कुछ स्पष्टीकरण जोड़ने के लिए संपादित:

कहते हैं कि तुम इस तरह की एक मॉडल है: एक न सहेजा गया बार वस्तु पर)

from django.db import models 
from django.forms import ModelForm 

class Foo(models.Model): 
    name = models.CharField(max_length = 30) 

class Bar(models.Model): 
     foos = models.ManyToManyField(Foo) 

    def __unicode__(self): 
     return " ".join([x.name for x in foos]) 

तो आप कॉल नहीं कर सकते यूनिकोड (। आप चीजों को बाहर मुद्रित करने के लिए इससे पहले कि वे सहेज लिया जाएगा चाहते हैं, तो आप इस करना है:

class BarForm(ModelForm): 
    class Meta: 
     model = Bar 

def example():  
    f1 = Foo(name = 'sue') 
    f1.save() 
    f2 = foo(name = 'wendy') 
    f2.save() 
    bf = BarForm({'foos' : [f1.id, f2.id]}) 
    b = bf.save(commit = false) 
    # unfortunately, unicode(b) doesn't work before it is saved properly, 
    # so we need to do it this way: 
    if(not bf.is_valid()): 
     print bf.errors 
    else: 
     for (key, value) in bf.cleaned_data.items(): 
      print key + " => " + str(value) 

तो, इस मामले में, आप कम महत्वपूर्ण चीज़ों वस्तुओं (जो आप उन सहेजने से पहले मान्य हो सकता है बचाया है करने के लिए, का उपयोग कर अपने स्वयं के रूप), और कई कुंजी के साथ मॉडल को बचाने से पहले, आप उनको भी मान्य कर सकते हैं। सभी को डेटा को बहुत जल्दी सहेजने और डेटाबेस को गड़बड़ करने या लेनदेन से निपटने की ज़रूरत के बिना ...

6

मैं एक फ़ील्ड जोड़ूंगा जो इंगित करता है कि वस्तुएं "ड्राफ्ट" या "लाइव" हैं या नहीं। इस तरह वे अनुरोध, सत्र इत्यादि में बने रहते हैं और डीजेंगो शिकायत बंद कर देता है।

फिर आप अपनी वस्तुओं को सार्वजनिक दृश्यों में केवल "लाइव" ऑब्जेक्ट्स दिखाने के लिए फ़िल्टर कर सकते हैं और केवल उपयोगकर्ता को बनाए गए उपयोगकर्ता को "ड्राफ्ट" ऑब्जेक्ट दिखा सकते हैं। इसे "संग्रहीत" ऑब्जेक्ट्स (या किसी भी अन्य राज्य को समझने की अनुमति देने के लिए भी बढ़ाया जा सकता है)।

0

बहुत देर से जवाब, लेकिन वाग्टेल की टीम ने django-modelcluster नामक एक अलग Django एक्सटेंशन बनाया है। यह उनके सीएमएस के मसौदे पूर्वावलोकन को शक्ति देता है।

from modelcluster.models import ClusterableModel 
from modelcluster.fields import ParentalKey 

class Band(ClusterableModel): 
    name = models.CharField(max_length=255) 

class BandMember(models.Model): 
    band = ParentalKey('Band', related_name='members') 
    name = models.CharField(max_length=255) 

फिर मॉडल इतना की तरह इस्तेमाल किया जा सकता:

यह आप कुछ इस तरह (अपने README से) करने की अनुमति देता

beatles = Band(name='The Beatles') 
beatles.members = [ 
    BandMember(name='John Lennon'), 
    BandMember(name='Paul McCartney'), 
] 

यहाँ, ParentalKey Django के ForeignKey के लिए प्रतिस्थापन है । इसी प्रकार, उनके पास Django के ManyToManyField को प्रतिस्थापित करने के लिए ParentalManyToManyField है।

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