mac*_*mac 12 python django django-models django-1.4
我是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)
Run Code Online (Sandbox Code Playgroud)
RecurringExpense只是一个模板:当系统意识到插入经常性费用的时间(例如:租金)时,它应该获取模板中的信息并将其复制到Expense类的新实例中.以下是RecurringExpense负责该工作的方法的相关部分:
Expense(description=self.description,
amount=self.amount,
category=self.category,
# tags=self.tags,
date=expense_date).save()
Run Code Online (Sandbox Code Playgroud)
以上工作完美无瑕,但如果我取消注释该tags=self.tags行,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
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建一个循环来解决这个问题,但我想知道是否有更优雅的方式可以让我立刻执行相同的操作....
Bot*_*res 13
创建模型实例时,无法直接设置m2m字段.请尝试以下方法:
expense = Expense(description=self.description,
amount=self.amount,
category=self.category,
date=expense_date)
expense.save()
expense.tags.add(*self.tags.all())
Run Code Online (Sandbox Code Playgroud)
您可以查看https://docs.djangoproject.com/en/1.4/topics/db/examples/many_to_many/,了解有关如何使用多对多关系的更多示例.
mac*_*mac 11
我能提出的最简单的方法:
e = Expense(description=self.description,
amount=self.amount,
category=self.category,
date=expense_date)
e.save()
e.tags = self.tags.all()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6741 次 |
| 最近记录: |