[英]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()方法检索了模型再次从数据库(尚未更新)中获取数据。我想要更新相关模型后,将它们保留在内存中,因此当我再次使用它们时,保留我设置的更新值。阅读文档和浏览的问题,但似乎找不到任何类似的内容。
所以我有两个问题:
还是我需要在偏移时将所有相关模型从主模型中移除,并将它们分配给我必须随主模型传递的变量?
任何关于实现此目标的更好方法的建议将不胜感激。
谢谢。
抱歉,按照您的榜样我很难过。 尽管我认为这是您想要的。
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.