鉴于模型
class Book(models.Model):
title = models.CharField(max_length=200)
price = models.FloatField()
inventory_quantity = models.IntegerField()
def movement(type, qty):
# ...
if type == 'sell':
self.inventory_quantity -= qty
if type == 'donation':
self.inventory_quantity += qty
# ...
class Operation(models.Model):
operation_type_choices = (
('sell', 'Sell'),
('donation', 'Donation'),
)
book = models.ManyToManyField(Book, through = 'BookOperation')
operation_type = models.CharField(max_length=50, choices=operation_type_choices)
def save(self, *args, **kwargs):
super(Operation, self).save(*args,**kwargs)
bok_op = BookOperation()
bok = Book()
op = Operation()
bok.movement(op.operation_type, bok_op.quantity)
class BookOperation(models.Model):
book = models.ForeignKey(Book)
operation = models.ForeignKey(Operation)
quantity = models.IntegerField()
在OPERATION模型上,我通过在Book的模型上执行save()
函数来覆盖movement()
函数来更改Book数量(至少这是意图)。
确定inventory_quantity是应该添加还是减去的逻辑是在这个函数中,这是正确的方法吗?
另外,我知道我的代码在Python如何处理对象方面是非常错误的,当我在管理面板上保存操作时我得到movment() takes exactly 2 arguments (3 given)
,为什么?我似乎只通过了op.operation_type, bok_op.quantity
感谢您的帮助
答案 0 :(得分:1)
我不清楚为什么要覆盖save
,但是你应该在那里进行super
调用最后,因为实际节省的是实例数据。
Re“正好接受2个参数(给定3个)”,movement
类中Book
方法的定义应该以{{1}}作为其第一个参数。自动将所有Python方法调用作为第一个方法参数传递给实例本身。
有关详情,请参阅Python文档:"the method function is declared with an explicit first argument representing the object, which is provided implicitly by the call..."
(另外,您没有告诉我们self
的定义位置,因此我们无法确定它是什么 - 从阅读代码看起来应该是liv
。)< / p>