Django的正确方法多对多省

时间:2015-05-21 15:59:18

标签: python django

鉴于模型

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

感谢您的帮助

1 个答案:

答案 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>