Мне нужно хранить комплексное число в модели Django.Для тех, кто забывает, это просто означает Z=R+jX
, где R и X - действительные числа, представляющие действительные и мнимые компоненты комплекса.Будут отдельные номера, а также списки, которые нужно хранить.Мои поиски до сих пор не дали хорошего решения для списков, поэтому я намерен разрешить базе данных обрабатывать список как отдельные записи.
Я вижу два варианта хранения комплексного числа:
1) создайте настраиваемое поле: class Complex(models.CharField)
Это позволило бы мне настроить все аспекты поля, но это требует дополнительной работы для проверки, если это нужно сделать правильно.Главный плюс в том, что одно число представлено одним полем в таблице.
2) пусть каждое комплексное число будет представлено строкой, с полем float
для действительной части, R, идругое поле float
для мнимой части, X. Недостатком этого подхода является то, что мне нужно написать несколько преобразователей, которые будут создавать комплексное число из компонентов, и наоборот.Положительным моментом является то, что база данных просто увидит ее как еще одну запись.
Конечно, эта проблема была решена в прошлом, но я не могу найти хороших ссылок, не говоря уж о какой-то конкретной информации о Джанго.
Это моя первая трещина на месторождении, она основана на другом примере, который я обнаружил, который включал несколько манипуляций со струнами.Что мне неясно, так это то, как и где должны выполняться различные проверки (например, приведение простого числа к сложному числу путем добавления + 0j).Я намерен также добавить функциональность формы, чтобы поле работало как поле с плавающей точкой, но с дополнительными ограничениями или требованиями.
Я еще не тестировал этот код, поэтому могут возникнуть проблемы с ним.Он основан на коде из ответа на этот вопрос SO.После выполнения кода появляется сообщение о том, что в именах методов произошли некоторые изменения.
Какой самый эффективный способ сохранить список в моделях Django?
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)