Использование Django ArrayField для хранения дат и значений - PullRequest
0 голосов
/ 03 июля 2018

Мне в настоящее время трудно обернуть голову вокруг Массива Джанго. То, что я надеюсь сделать, это иметь массив, который выглядит примерно так:

Price(close=[
    [1/1/2018, 3.00],
    [1/2/2018, 1.00],
])

В основном это массив, в котором хранится дата, за которой следует соответствующее значение, привязанное к этой дате. Однако пока моя модель выглядит так:

class Price(models.Model):
    close = ArrayField(
            models.DecimalField(max_digits=10, decimal_places=4),
            size=365,           
        )

Я не уверен, как создать массив с двумя различными типами полей, один DateTime, другой десятичный. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 31 июля 2018

Зависит от того, насколько это важно для модели.

postgresql предоставляет составных типов

Щедрый участник psycopg2 (драйвер posjresql от django) поддерживает it ,

определить этот тип в postgresql:

   CREATE TYPE date_price AS (
       start date,
       float8 price
   );

и использование методов, описанных здесь для реализации CompositeField

   from django.db import models
   from django.contrib.postgres.fields import ArrayField
   from django.db import connection
   from psycopg2.extras import register_composite

   # register the composite 

   register_composite('date_price', connection.cursor().cursor)


   # CompositeField implementation here . . . . . .



   class DatePriceField(CompositeField):
       '''
       DatePriceField specifics
       '''
       pass

   class Price(models.Model):
       close = ArrayField(base_field=DatePriceField(), size=365,)

Я собираюсь следовать по этому маршруту и ​​скоро обновлю.

0 голосов
/ 03 июля 2018

Нельзя смешивать типы, хранящиеся в ArrayField. [1] Я рекомендую вам изменить схему модели (она же нормализация базы данных [2]).

Это мое предложение:

from django.db import models


class Price(models.Model):
    pass


class PriceItem(models.Model):
    datetime = models.DateTimeField()
    ammount = models.DecimalField(max_digits=10, decimal_places=4)
    price = models.ForeignKey(Price, on_delete=models.CASCADE)

[1] https://stackoverflow.com/a/8168017/752142

[2] https://en.wikipedia.org/wiki/Database_normalization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...