Как заставить настраиваемое поле выводить разные типы данных в зависимости от файла, запрашивающего данные?Python

Программы на Python
Ответить
Anonymous
 Как заставить настраиваемое поле выводить разные типы данных в зависимости от файла, запрашивающего данные?

Сообщение Anonymous »

Я создаю свойства молекулы, отображающие веб-сайт, используя django и sqlite. База данных принимает массив numpy и сохраняет его как BLOB. В настоящее время он просто выводит массив numpy обратно, когда его об этом просят. Я бы хотел, чтобы он проверял, какой файл запрашивает данные, и выводил массив numpy, если его запрашивает Python (например, для проверки целостности данных), и объект json, если его запрашивает файл javascript (например, для визуализации молекул).
Я даже не уверен, возможно ли это, поэтому думаю, что мой вопрос двоякий. Во-первых, возможно ли это? Во-вторых, если это не так, пока данные доступны только для чтения, могут ли возникнуть какие-либо серьезные проблемы, если я позволю входным данным быть пустым массивом, а выходным — json.
Настраиваемое поле определяется так:
Используемые пакеты:

Код: Выделить всё

import io
import json
import numpy as np
from django.db.models import BinaryField
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
Для текущей реализации только numpy:

Код: Выделить всё

# Stores numpy array as BLOB then returns BLOB as np array
class NpArrayField(BinaryField):
"""
Turns numpy array into raw binary data to store in database. When take from database, it outputs the numpy array.
"""
def from_db_value(self, value, expression, connection):

if value is None:
return None
buffer = io.BytesIO(value)
return np.load(buffer, allow_pickle=True) # returns numpy array

def to_python(self, value):

if value is None or isinstance(value, np.ndarray):
return value

# If it's bytes from DB or form
if isinstance(value, (bytes, bytearray)):
buffer = io.BytesIO(value)
return np.load(buffer, allow_pickle=True)

raise ValidationError(_("NpArrayField value must be a numpy.ndarray or a byte/bytearray"))

def get_prep_value(self, value):

if value is None:
return None

if not isinstance(value, np.ndarray):
raise ValidationError(_("NpArrayField value must be a numpy.ndarray"))

buffer = io.BytesIO()
np.save(buffer, value, allow_pickle=True)
return buffer.getvalue()

def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
return name, path, args, kwargs
Реализация, которая принимает массив numpy (хранится как BLOB) и выводит json:

Код: Выделить всё

class NpArrayEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, numpy.ndarray):
return obj.tolist()
return json.JSONEncoder.default(self,obj)

class NpArrayField(BinaryField):
"""
Turns numpy array into json style raw binary data to store in database. When taken from the database, it outputs the json
"""
def from_db_value(self, value, expression, connection):

if value is None:
return None
return value.decode('utf-8'))

def to_python(self, value):
if value is None:
return None
return value

def get_prep_value(self, value):

if value is None:
return None

if not isinstance(value, np.ndarray):
raise ValidationError(_("NpArrayField value must be a numpy.ndarray"))

np_as_json = json.dumps({"array" : value}, cls=NpArrayEncoder)
return bytes(np_as_json, 'utf-8')

def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
return name, path, args, kwargs
Если кому-то интересно, эти массивы должны быть неизменяемыми, поэтому в этой парадигме имеет смысл хранить их как атомарные единицы, а не как отдельные значения.


Подробнее здесь: https://stackoverflow.com/questions/798 ... ile-asking
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»