2012-04-09 1 views
7

저는 장고를 처음 사용하고 학습 응용 프로그램으로 비용 기록 응용 프로그램을 구축하고 있습니다. 내 모델에서하나의 모델 인스턴스에서 다른 모델 인스턴스로 ManyToMany 필드 복사

나는 다음과 같이 세 가지 클래스가 (나는 약간 간결함을 위해 그들을 간체) :

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 행의 주석을 해제하는 경우, 장고는 불평하고 다음과 같은 오류 던져 :

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을 이 문제를 해결하려면 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 (...)'/'e.save()'를'Expense.objects.create (...) '로 대체 할 수 있습니다 –

+0

많은 수의 태그가있는 경우 작동하지 않을 수 있습니다 (SQL 드라이버 매달린). 이 경우 모든 태그에 대해 큰 덩어리로 반복하여 추가 할 수 있습니다. – odedfos

11

모델을 만들 때 m2m 필드를 직접 설정할 수 없습니다. i 구조. 다음 대신보십시오 :

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

나는 종종 기존의 m2m 관계 집합을 대체 할 필요가 없으며, 단지 더하기 만하면된다. 당신의 할당 사례를 위해서'ManyRelatedObjectsDescriptor'는'.clear' +'.add (* values)'를 사용하기 때문에 실제로 할당은 더 간단하고 잘 작동해야합니다. –

+0

좋은 지적. Upvoted! :) – mac