gpt4 book ai didi

python - 如何在 Django 模型中存储复数

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:32 26 4
gpt4 key购买 nike

我需要在 Django 模型中存储一个复数。对于那些忘记的人,这只是意味着 Z=R+jX,其中 R 和 X 是代表复数的实部和虚部的实数。将有个人号码,以及需要存储的列表。到目前为止,我的搜索还没有为列表提供好的解决方案,所以我打算让数据库将列表作为单独的记录来处理。

我看到两个存储复数的选项:

1) 创建自定义字段:class Complex(models.CharField)这将允许我自定义该字段的所有方面,但如果要正确完成,则需要进行大量额外的验证工作。主要的好处是单个数字由表中的单个字段表示。

2) 让每个复数用一行表示,实部 R 有一个 float 字段,虚部 X 有另一个 float 字段. 这种方法的缺点是我需要编写一些转换器来从组件创建复数,反之亦然。好处是数据库只会将其视为另一条记录。

当然这个问题在过去已经解决了,但是我找不到任何好的引用资料,更不用说 Django 了。

这是我第一次涉足该领域,它基于我发现的另一个涉及一些字符串操作的示例。我不清楚的是应该如何以及在何处执行各种验证(例如通过添加 +0j 将简单的 float 强制转换为复数)。我还打算添加表单功能,以便该字段的行为类似于 float 字段,但有额外的限制或要求。

我还没有测试过这段代码,所以它可能存在问题。它基于此 SO 问题中答案的代码。运行代码后发现方法名发生了一些变化。

What is the most efficient way to store a list in the Django models?

class ComplexField(models.CharField):

description = 'A complex number represented as a string'

def __init__(self, *args, **kwargs):
kwargs['verbose_name'] = 'Complex Number'
kwargs['max_length'] = 64
kwargs['default'] = '0+0j'

super().__init__(*args, **kwargs)

def to_python(self, value):
if not value: return
if isinstance(value, complex):
return value
return complex(value)

def get_db_prep_value(self, value):
if not value: return
assert(isinstance(value, complex))
return str(item)[1:-1]

def value_to_string(self, obj):
value = self._get_val_from_obj(obj)
return self.get_db_prep_value(value)

最佳答案

关于自定义字段,您可能已经在 Django documentation 中找到了相关部分已经。

自定义字段(或自定义数据库类型,见下文)是否值得麻烦实际上取决于您需要如何处理存储的数字。对于存储和偶尔推来推去,您可以使用最简单的理智解决方案(Tobit 增强了您的第二个解决方案)。

使用 PostgreSQL,您可以直接在数据库中实现自定义类型,包括 operators .这是 Postgres docs 中的相关部分,并附有一个复数示例。

当然,您随后需要将新类型和运算符公开给 Django。相当多的工作,但随后您可以使用 Django ORM 对数据库中的各个字段进行算术运算。

关于python - 如何在 Django 模型中存储复数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55229112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com