Я новичок в django, и в качестве обучающего приложения я создаю приложение для регистрации расходов.Копирование полей 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, чтобы обойти эту проблему, но мне интересно, есть ли более элегантный способ, который позволил бы мне выполнить то же самое сразу ....
Вы также можете заменить 'Expense (...)' /'e.save() 'на' Expense.objects.create (...) ' –
Это может не сработать, если у вас большое количество тегов (драйвер SQL зависимый). В этом случае вы можете выполнять итерацию в больших кусках по всем тегам, чтобы добавить их. – odedfos