gpt4 book ai didi

python - 我将什么类型的数据传递到 Django Model.save() 方法中?

转载 作者:太空宇宙 更新时间:2023-11-03 19:37:14 24 4
gpt4 key购买 nike

假设我们在 Django 中发布了这样的表单:

rate=10
items= [23,12,31,52,83,34]

这些项目是项目模型的主键。我有一堆业务逻辑,它们将根据这些数据、一些数据库查找的结果和一些业务逻辑来运行和创建更多项目。我想将该逻辑放入保存信号或另一个模型(我们称之为 Inventory)的重写 Model.save() 方法中。当我使用此表单数据创建新的 Inventory 对象时,业务逻辑将运行。库存将如下所示:

class Inventory(models.Model):
picked_items = models.ManyToManyField(Item, related_name="items_picked_set")
calculated_items = models.ManyToManyField(Item, related_name="items_calculated_set")
rate = models.DecimalField()
... other fields here ...

将根据传入的项目创建新的calculated_items,并将其存储为picked_items

我的问题是:这个模型上的 save() 方法是否更好接受:

  • 请求对象(我不太喜欢这种耦合)
  • 作为参数或 kwargs 的表单数据(主键和其他表单字段的列表)
  • 项目列表(调用者表单或 View 将查找项目列表并创建列表并传入其他表单字段)
  • 还有其他方法吗?

我知道这有点主观,但我想知道总体思路是什么。我浏览了很多代码,但很难找到我喜欢的模式。

澄清:

好的,所以共识是它应该进入模型上的不同函数,例如 inventory.calculate(...) ,然后它将创建所有内容,执行业务逻辑等... 很高兴知道这一点。我的问题仍然是:在数据库对象中查找表单数据的最佳位置在哪里?该函数的调用者是否应该将主键转换为数据库模型,或者模型方法是否应该接受主键并自行执行?我想在整个项目范围内以同样的方式做这件事。

澄清2:

好吧,现在对于重写 save 是否可以存在一些分歧。

当您收到简单 CRUD 类型操作的表单提交时,您可以将模型和值作为参数传递给 Model.objects.create(...) 或覆盖 save code> 或使用信号或其他任何东西。

我认为我的问题的核心是:

如果表单提交有相关的模型用于业务逻辑,那么您需要将一些业务逻辑写入您的模型层。当你这样做时,它应该去哪里?该方法应该接受对象列表还是 id 列表?模型 API 应该接受对象还是 ID?

最佳答案

好吧,我得到的前两个答案现在已经被其他人反驳了。我一直在研究这个问题,我将尝试自己回答这个问题。如果您认为这是正确的,请投票;如果您不同意我的推理,请发表评论。

  • 模型上的方法应该接受对象和对象列表,而不是 int/long 形式的 id 或 id 列表或类似的东西。这是因为它可能会从 View 或表单中调用,并且它们可以访问 cleaned_data 字典中的完整对象。管理器类上的 create() 方法是 django 本身接受对象的另一个示例。

  • 模型层方法的调用者应该查找 id 并将其转换为完整对象。

  • 您可以重写 save(),但如果这样做,您应该小心接受 args**kwargs

  • 如果模型跨越应用程序,您应该考虑信号而不是覆盖save

  • 不要试图巧妙地覆盖模型管理器的create方法。如果 View 层创建一个新对象并保存它,则不会调用它。如果您需要在保存之前进行额外的处理,您可以覆盖 save__init__ 或捕获信号。如果您覆盖 __init__ 您可以检查 pk 以确定它是否存在于数据库中。

我现在将把我的创建代码放在一个单独的方法中,直到我弄清楚我最喜欢哪种技术。

我认为这是向模型层添加方法的一套很好的指南。我错过了什么吗?

关于python - 我将什么类型的数据传递到 Django Model.save() 方法中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947397/

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