Django:如何在创建模型时更新相关的模型字段

时间:2017-07-22 18:25:28

标签: django django-models

Django 1.11

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

  1. 覆盖statusupdate
  2. 上的save()方法
  3. using signals
  4. custom model manager,可以查询相关模型和更新字段
  5. 模型上可以调用相关模型的方法 并更新我想要的地方。
  6. 我删除了一些字段以使示例更简单。

    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)
         ...
    

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

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

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

2 个答案:

答案 0 :(得分:0)

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

status_update_instance.odometer = some value
status_update.save()

以上是statusupdate模型的实例

答案 1 :(得分:0)

实际上所有的方式都很好,并且各有利弊。

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

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

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