gpt4 book ai didi

python - Django多对多保存的正确方法

转载 作者:太空宇宙 更新时间:2023-11-03 17:42:06 25 4
gpt4 key购买 nike

给定模型

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 模型上,我重写了 save() 函数,通过在 Book 模型上执行 movement() 函数来更改 Book 数量(至少那是意图)。确定 inventory_quantity 是否应该增加或减少的逻辑就在这个函数中,这是正确的方法吗?

此外,我知道我的代码在 Python 处理对象的方式方面是极其错误的,当我在管理面板上保存操作时,我得到 movment() 恰好需要 2 个参数(给定 3 个参数),为什么?看来我只传递了 op.operation_type, bok_op.quantity

感谢您的帮助

最佳答案

我不太清楚为什么要重写 save,但你应该在那里进行 super 调用 last,因为它是实例数据的实际保存是做什么的。

关于“仅接受 2 个参数(给定 3 个参数)”,Book 类中 movement 方法的定义应采用 self 作为它的第一个论点。所有 Python 方法调用都会自动将实例本身作为第一个方法参数传递。

有关更多信息,请参阅 Python 文档:"the method function is declared with an explicit first argument representing the object, which is provided implicitly by the call..."

(此外,您没有向我们展示 liv 的定义位置,因此我们无法确定它是什么 - 从阅读您的代码来看,它似乎应该是 self 相反。)

关于python - Django多对多保存的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com