繁体   English   中英

Django-以一对多关系更改相关对象上的值

[英]Django - altering the values on related objects in a one-to-many relationship

我有一个代表财务模型的Django模型。 该模型与也包含财务数据的另一组模型具有一对多关系。 在我的数据库中,我将值存储为美元($),但是当我使用模型时,我希望能够在欧元和英镑之间进行转换。

因此,我在模型中添加了一个名为convert_to_ccy(rate)的方法,如果调用此方法,我也希望它也可以转换相关模型(通过这种一对多关系)。 这是一个非常简单的示例,以说明我要执行的操作。

class main_model_example(models.Model):

    INCLUDE_IN_CCY_CONVERSION = ['value_field_1', 'value_field_2' etc...]

    # FIELD DEFINITIONS
    date = models.DateField()
    value_field_1 = models.DecimalField(max_digits=20, decimal_places=2, default=0.00)
    value_field_2 = models.DecimalField(max_digits=20, decimal_places=2, default=0.00)
    ...etc...

    # METHODS
    def convert_to_ccy(self, rate):
    """Converts $ fields"""
        for field in self._meta.get_all_field_names():
            if field in self.INCLUDE_IN_CCY_CONVERSION:
                value = getattr(self, field)
                    if value != None:
                    setattr(self, field, float(value) / rate)

        # NOW CONVERT THE RELATED MODELS
        for position in self.the_related_model_set.all():
            position.convert_to_ccy_rate(rate)


# THE RELATED MODEL
class the_related_model(models.Model):

    INCLUDE_CCY_CONVERSION = ['yet_another_finacial_field']

    main_model_example = models.ForeignKey(main_model_example, on_delete=models.CASCADE)
    yet_another_financial_field = models.DecimalField(max_digits=20, decimal_places=2, default=0.00)
    ...and so on....

    def convert_to_ccy(self, rate):
    """Converts $ fields"""
        for field in self._meta.get_all_field_names():
            if field in self.INCLUDE_IN_CCY_CONVERSION:
                value = getattr(self, field)
                    if value != None:
                    setattr(self, field, float(value) / rate)

这有效,并转换正确的字段。 在我的代码(views.py等)中,我传递了保留我设置的新值(即欧元)的主模型。

但是,当我再次从相关模型中获取信息时(通过使用model.the_related_model_set.all()的主模型),值又回到了美元。我认为这是因为xxx_set.all()方法检索了模型再次从数据库(尚未更新)中获取数据。我想要更新相关模型后,将它们保留在内存中,因此当我再次使用它们时,保留我设置的更新值。阅读文档和浏览的问题,但似乎找不到任何类似的内容。

所以我有两个问题:

  1. 我想实现的目标可能吗? 即更新内存中的相关(一对多)模型,绕过主模型(进行更多计算),然后在稍后再次引用相关模型时取回更新后的值。

还是我需要在偏移时将所有相关模型从主模型中移除,并将它们分配给我必须随主模型传递的变量?

  1. 我这样做的事实是否被认为是不好的? 是否具有主要模型方法调用相关模型方法? 我对实施不太满意,通常会建议有更好的方法。

任何关于实现此目标的更好方法的建议将不胜感激。

谢谢。

抱歉,按照您的榜样我很难过。 尽管我认为这是您想要的。

django Queriest有一个.update()方法,该方法可以将要更新的新属性传递到其中,并且这些值将保持不变。

my_django_class.objects.all().update(my_class_attr=new_value)

要获取查询集,可以在查询中使用相关名称。 Django默认生成它们,但我发现最好显式定义它们。 这个堆栈问题很好地解决了这些问题

这样,您的方法将如下所示(如果我没看错的话):

def _update_currancies(self):
    Some_other_model(_the_related_name__field = main_model).update(attr = new_value)

我发现触发请求时最好不要更新表。 通常,我只会添加两个其他字段,并且每次输入值更改时(在这种情况下为USD),请使用方法来更新其他字段(可以通过覆盖save方法来完成)。

对于您的情况,它看起来像这样:

class main_model_example(models.Model):
   us_number = models.DecimalField(max_digits=20, decimal_places=2, default=0.00)
   eur_number = models.DecimalField(max_digits=20, decimal_places=2, default=0.00)
   ccy_number = models.DecimalField(max_digits=20, decimal_places=2, default=0.00)

   def _update_currancies(self):
       #update and set new currency values
       #e.g. self.eur_number = self.us_number * .96

   def save(self, *args, **kwargs):
       self._update_currancies()
       super(main_model_example, self).save(*args, **kwargs)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM