【问题标题】:Django: How to update related model fields when creating modelDjango:创建模型时如何更新相关模型字段
【发布时间】:2017-12-28 16:42:46
【问题描述】:

Django 1.11

我有多个具有与status 相同字段的模型,例如repairOrder、statusUpdate,它们具有与status 一样的里程表字段。当用户进行新的 statusupdate 或 repairOrder 时,我希望它也更新状态模型中的某些字段。我看到它的方式有四个选项

  1. 在 statusupdate 上覆盖 save() 方法
  2. using signals
  3. custom model manager,可以查询相关模型和更新字段
  4. 模型上将调用相关模型的方法 并更新到我想要的位置。

我删除了一些字段以使示例更简单。

class Status(models.Model):
     odometer = models.IntegerField()
     vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE)
     ...

class statusUpdate(models.Model):
     odometer = models.IntegerField()
     vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE)
     ...

当用户创建新的 statusUpdate 时,我希望同时设置 Status 上的里程表。

问: Django 更新相关模型字段的方式是什么?

编辑:编辑了很多问题以澄清问题

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    其实所有的方法都是好的,各有优劣。

    如果这些模型在不同的应用程序中并且大部分是独立的,那么信号很酷。它的好处是在正常情况下它不会打扰您,并且您将拥有更多的控制权。

    通过重写 save() 方法是个好主意,但如果您不必每次或大部分时间都这样做但在非常特定的时间,请创建一个不同的方法,您将通过该方法调用 save() 方法以及做任何你想做的事情。这里的好处是您可以设置尽可能多的条件,尝试捕获异常和 if else 条件,它不会影响保存方法。

    你必须找到最适合情况的需要。根据我自己的经验和人们所说的,在必要之前不要使用信号。

    【讨论】:

      【解决方案2】:

      不需要状态更新中的里程表字段,因为您已经拥有状态模型的外键,因此您可以访问状态模型的每个字段。只需从 statusmodel 中删除里程表,然后当您执行状态更新时更新里程表字段。

      status_update_instance.odometer = some value
      status_update.save()
      

      以上是statusupdate模型的一个实例

      【讨论】:

      • 对于第一个评论,给出的答案也将在那里工作。对于第二条评论,是的,您可以继承模型,但如果您想自动更新,则必须覆盖保存方法,否则您必须制作自定义模型管理器。覆盖保存方法会更容易。
      • 从里程表 ID 过滤,然后按日期排序(如果有的话),然后选择第二个索引。只是简单的orm
      • 即使您保留里程表的现场解决方案也可以应用。您仍然可以像上面提到的那样更新字段
      猜你喜欢
      • 1970-01-01
      • 2017-07-22
      • 2019-09-10
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 2016-11-04
      • 2015-06-13
      • 1970-01-01
      相关资源
      最近更新 更多