Tôi mới dùng django, và như một ứng dụng học tập, tôi đang xây dựng một ứng dụng ghi nhật ký chi phí.Sao chép các trường ManyToMany từ một trường hợp mẫu khác
Trong mô hình của tôi, tôi có ba lớp giống như thế này (tôi đơn giản hóa chúng một chút cho ngắn gọn):
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
chỉ là một mẫu: khi hệ thống nhận ra rằng thời gian để chèn một chi phí định kỳ (ví dụ: tiền thuê nhà) cần lấy thông tin trong mẫu và sao chép chúng trong một trường hợp mới của lớp Expense
. Dưới đây là các bit có liên quan từ RecurringExpense
phương pháp chịu trách nhiệm về công việc:
Expense(description=self.description,
amount=self.amount,
category=self.category,
# tags=self.tags,
date=expense_date).save()
Các công trình trên một cách hoàn hảo, nhưng nếu tôi bỏ ghi chú dòng tags=self.tags
, django phàn nàn và ném các lỗi sau:
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
tôi biết I could create a loop để giải quyết vấn đề này, nhưng tôi tự hỏi nếu có một cách thanh lịch hơn sẽ cho phép tôi thực hiện cùng một lúc ...
Bạn cũng có thể thay thế 'Chi phí (...) '/'e.save()' bằng 'Expense.objects.create (...)' –
Điều này có thể không hoạt động nếu bạn có một số lượng lớn thẻ (trình điều khiển SQL phụ thuộc). Trong trường hợp này, bạn có thể lặp trong các khối lớn trên tất cả các thẻ để thêm chúng. – odedfos