在Django中将计算值从视图保存到模型

Posted

技术标签:

【中文标题】在Django中将计算值从视图保存到模型【英文标题】:Save Calculated Value from View to Model in Django 【发布时间】:2021-10-28 05:20:18 【问题描述】:

我有一个 Django 应用程序,它让用户可以选择是否在表单中保存计算。

如果用户说要保存计算,我也想将计算结果连同输入的详细信息一起保存在数据库中。

对于用户输入,我已经能够保存它。保存由views.py 处理的计算结果时会遇到挑战。

我的代码如下:

为了我的views.py

def coordinate_transform(request):
    if request.method == 'POST':
        form = CoordinateForm(request.POST)
        if form.is_valid():
            from_epsg = request.POST.get('from_epsg')
            y = request.POST.get('y')
            x = request.POST.get('x')
            to_epsg = request.POST.get('to_epsg')
            # Transform Coordinates
            transformer = Transformer.from_crs(int(from_epsg), int(to_epsg))
            transformed = transformer.transform(y, x)
            # Save to Database? 
            save_data = request.POST.get('saved')
            if save_data == 'on':
                form.save()
                messages.success(request, "Coordinate Transormation data stored")

            context = 
                'form': form,
                'y': transformed[0],
                'x': transformed[1],
            

            return render(request, 'utility/coordinate_transform.html', context)


    else:
        form = CoordinateForm()

    context = 
        'form': form,
    


    return render(request, 'utility/coordinate_transform.html', context)

在上面的代码中,form.save() 工作正常,但没有保存计算。我尝试使用Django Querysets 来保存模型,但它不起作用。

这是我的model.py

class CoordinateTransform(models.Model):
    from_epsg = models.ForeignKey(CRS, on_delete=models.CASCADE, related_name='from_epsg')
    x = models.FloatField(verbose_name="X/Lon")
    y = models.FloatField(verbose_name="Y/Lat")
    to_epsg = models.ForeignKey(CRS, on_delete=models.CASCADE, related_name='to_epsg')
    x_trans = models.FloatField(verbose_name='X-Transformed', null=True, blank=True)
    y_trans = models.FloatField(verbose_name='Y-Transformed', null=True, blank=True)
    stored_on = models.DateTimeField(auto_now_add=True)

最后是我用来从forms.py收集用户输入的表单

class CoordinateForm(ModelForm):
    # some widget stuff here
    class Meta:
        model = CoordinateTransform
        fields = ('from_epsg', 'y', 'x', 'to_epsg')

如何才能确保计算结果也存储在数据库中?

【问题讨论】:

【参考方案1】:

您可以使用form.save(commit=False) 推迟保存对象,然后像这样添加计算字段:

def coordinate_transform(request):
    if request.method == 'POST':
        form = CoordinateForm(request.POST)
        if form.is_valid():
            ...
            # Save to Database? 
            save_data = request.POST.get('saved')
            if save_data == 'on':
                instance = form.save(commit=False)
                instance.x_trans = transformed[1]
                instance.y_trans = transformed[0]
                instance.save()
                messages.success(request, "Coordinate Transormation data stored")

【讨论】:

非常感谢。此解决方案完美运行,没有任何并发​​症。

以上是关于在Django中将计算值从视图保存到模型的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 django 的同一视图功能中将最近保存的数据发送到模板中

如何在iphone中将值从一个标签栏传递到另一个标签栏

如何将值从视图传递到不可编辑的字段django python

从 GraphQL 计算一个值并将其保存在 Django 模型中

django 内联覆盖保存

在 Django 中将 cache.clear() 添加到全局保存