2012-04-09 14 views
7

पर कॉपी करना मैं django के लिए नया हूं, और एक सीखने वाला ऐप के रूप में, मैं एक व्यय लॉगिंग एप्लिकेशन बना रहा हूं।कई मॉडल फ़ील्ड को एक मॉडल उदाहरण से दूसरे

अपने मॉडल में मैं तीन वर्गों है कि इस तरह लग रहे है (मैं उन्हें थोड़ा संक्षिप्तता के लिए सरलीकृत):

class AbstractExpense(models.Model): 
    description = models.CharField(max_length=100) 
    amount  = models.IntegerField() 
    category = models.ForeignKey('Category') 
    tags  = models.ManyToManyField('Tag') 
    insert_date = models.DateTimeField(auto_now=True) 

    class Meta(object): 
     abstract = True 

class Expense(AbstractExpense): 
    date  = models.DateField('Date') 

class RecurringExpense(AbstractExpense): 
    FREQUENCY_CHOICES = (('D', 'daily'), 
         ('W', 'weekly'), 
         ('M', 'monthly'), 
         ('Y', 'yearly')) 
    start_date = models.DateField(blank=False) 
    end_date = models.DateField(blank=True, null=True) 
    last_check = models.DateField(blank=True, null=True) 
    frequency = models.CharField(blank=False, max_length=1, choices=FREQUENCY_CHOICES) 

RecurringExpense सिर्फ एक टेम्पलेट है: जब सिस्टम पता चलता है कि समय (एक आवर्ती व्यय सम्मिलित करने के लिए उदाहरण: किराया) इसे टेम्पलेट में जानकारी लेनी चाहिए और उन्हें Expense कक्षा के नए उदाहरण में कॉपी करना चाहिए। यहाँ काम के आरोप में RecurringExpense विधि से प्रासंगिक सा है:

Expense(description=self.description, 
     amount=self.amount, 
     category=self.category, 
     # tags=self.tags, 
     date=expense_date).save() 

दोषरहित ऊपर काम करता है, लेकिन अगर मैं tags=self.tags लाइन uncomment, Django शिकायत करता है और निम्न त्रुटि फेंक:

Exception Type: TypeError 
Exception Value: 'tags' is an invalid keyword argument for this function 
Exception Location: <snip>/django/db/models/base.py in __init__, line 367 

मैं इस समस्या के आसपास काम करने के लिए I could create a loop पता है, लेकिन मुझे आश्चर्य है कि क्या एक और शानदार तरीका है जो मुझे एक ही बार में प्रदर्शन करने की अनुमति देगा ....

उत्तर

8

simpliest विधि मैं के साथ आ सकता है:

e = Expense(description=self.description, 
      amount=self.amount, 
      category=self.category, 
      date=expense_date) 
e.save() 
e.tags = self.tags.all() 
+1

आप 'Expense.objects.create (...)' –

+0

के साथ 'व्यय (...) '/'e.save()' को प्रतिस्थापित भी कर सकते हैं यदि आपके पास बड़ी संख्या में टैग हैं (SQL ड्राइवर निर्भर)। इस मामले में आप उन्हें जोड़ने के लिए सभी टैग पर बड़े हिस्से में पुनरावृत्त कर सकते हैं। – odedfos

11

आप मॉडल बनाने के दौरान सीधे एम 2 एम फ़ील्ड सेट नहीं कर सकते हैं I nstance। निम्नलिखित के बजाय का प्रयास करें:

expense = Expense(description=self.description, 
     amount=self.amount, 
     category=self.category, 
     date=expense_date) 
expense.save() 
expense.tags.add(*self.tags.all()) 

आप कितने-से-अनेक रिश्तों के साथ काम करने के लिए के बारे में अधिक उदाहरण के लिए जाँच कर सकते हैं https://docs.djangoproject.com/en/1.4/topics/db/examples/many_to_many/

+0

हाय और आपका जवाब के लिए धन्यवाद। क्या कोई विशिष्ट कारण है कि आप सरल असाइनमेंट के बजाय सूची के अनपॅकिंग के साथ '.add()' विधि का उपयोग क्यों करते हैं (मेरा अपना जवाब देखें)? – mac

+0

मुझे अक्सर मौजूदा एम 2 एम रिलेशनशिप सेट को प्रतिस्थापित करने की आवश्यकता नहीं है, बस इसमें जोड़ें, और उससे भी अधिक उपयोग किया जाता है। आपके उपयोग के मामले में वास्तव में असाइनमेंट सरल है और ठीक काम करना चाहिए, क्योंकि जब आप असाइनमेंट करते हैं तो 'ManyRelatedObjectsDescriptor'' .clar' + '.add (* मान)' दृश्यों के पीछे होता है। –

+0

अच्छा बिंदु। Upvoted! :) – mac

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