使用Django ArrayField存储日期和值

时间:2018-07-03 17:53:04

标签: django postgresql django-models

我目前很难把头放在Django的Array Field上。我希望做的是拥有一个看起来像这样的数组:

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 :(得分:0)

您不能混合存储在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

答案 1 :(得分:0)

这取决于它对模型的重要性。

postgresql提供composite types

psycopg2(django的posgresql驱动程序)的慷慨捐助者正在支持it

在postgresql中定义此类型:

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

并使用the methods described here来实现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,)

我将遵循这条路线并尽快更新。