Python Django中不规则嵌入阵列字段的处理

Python Django中不规则嵌入阵列字段的处理,python,arrays,django,postgresql,python-3.x,Python,Arrays,Django,Postgresql,Python 3.x,我目前正在将Django与PostgreSQL一起使用。我使用django extensions运行自定义脚本,将数据插入数据库。我有一个模型如下: class Route(models.Model): """ Bus routes of İzmir. """ code = models.PositiveSmallIntegerField( unique=True, primary_key=True, verbos

我目前正在将Django与PostgreSQL一起使用。我使用
django extensions
运行自定义脚本,将数据插入数据库。我有一个模型如下:

class Route(models.Model):
    """
    Bus routes of İzmir.
    """

    code = models.PositiveSmallIntegerField(
        unique=True,
        primary_key=True,
        verbose_name="Code"
    )

    stops = models.ManyToManyField(
        Stop,
        null=True,
        blank=True,
        related_name="routes",
        verbose_name="Stops"
    )

    terminals = ArrayField(
        models.CharField(
            null=False,
            blank=False,
            max_length=32,
        ),
        size=2,
        default=[],
        verbose_name="Terminals"
    )

    departure_times = ArrayField(
        ArrayField(
            models.TimeField(
                null=False,
                blank=False
            ),
            null=True, # This was added later to maybe solve the problem.
            default=[]
        ),
        default=[],
        size=6,
        verbose_name="Departure Times"
    )

    class Meta:
        verbose_name = "Route"
        verbose_name_plural = "Routes"
        ordering = ["code"]
[
    [1, 2, 3],
    [4, 5],
    [6, 7, 8, 9, 10]
]
def equalizer(data):
    largest_length = 0 # To define the largest length

    for l in data:
        if len(l) > largest_length:
            largest_length = len(l) # Will define the largest length in data.

    for i, l in enumerate(data):
        if len(l) < largest_length:
            remainder = largest_length - len(l) # Difference of length of particular list and largest length
            data[i].extend([None for i in range(remainder)]) # Add None through the largest length limit

    return data
如您所见,我已将另一个
数组字段
嵌入到
出发时间
。我的数据有不规则的形状,如注释中所述。因此,自然会产生如下错误:

class Route(models.Model):
    """
    Bus routes of İzmir.
    """

    code = models.PositiveSmallIntegerField(
        unique=True,
        primary_key=True,
        verbose_name="Code"
    )

    stops = models.ManyToManyField(
        Stop,
        null=True,
        blank=True,
        related_name="routes",
        verbose_name="Stops"
    )

    terminals = ArrayField(
        models.CharField(
            null=False,
            blank=False,
            max_length=32,
        ),
        size=2,
        default=[],
        verbose_name="Terminals"
    )

    departure_times = ArrayField(
        ArrayField(
            models.TimeField(
                null=False,
                blank=False
            ),
            null=True, # This was added later to maybe solve the problem.
            default=[]
        ),
        default=[],
        size=6,
        verbose_name="Departure Times"
    )

    class Meta:
        verbose_name = "Route"
        verbose_name_plural = "Routes"
        ordering = ["code"]
[
    [1, 2, 3],
    [4, 5],
    [6, 7, 8, 9, 10]
]
def equalizer(data):
    largest_length = 0 # To define the largest length

    for l in data:
        if len(l) > largest_length:
            largest_length = len(l) # Will define the largest length in data.

    for i, l in enumerate(data):
        if len(l) < largest_length:
            remainder = largest_length - len(l) # Difference of length of particular list and largest length
            data[i].extend([None for i in range(remainder)]) # Add None through the largest length limit

    return data
django.db.utils.DataError:多维数组必须具有具有匹配维度的数组表达式

正如文档中提到的“底层字段应设置为可空”,我将
null=True
添加到嵌入的
ArrayField
。但是,我不理解文件说明中的以下陈述:

值填充为“无”

我头上的问题是 1) 我是否会处理这些数据,修改不规则列表的长度,如下所示

[a, b, c, None, None]
[a, b, None, None, None]
[a, b, c, d, e]
2) 是否有一种内置的方法来克服
数据错误


如果您认为看到脚本可以帮助您解决问题


环境
  • python 3.5.1
  • django 1.9.7
  • psycopg2 2.6.2
  • postgresql 9.5

    • 因此,似乎没有人参与这个问题。因此,我想分享我自己的解决方案。简言之,我以上述问题(1)的方式修改了脚本,这意味着,我使用filler
      None
      值扩展了每个列表,以均衡每个列表的长度

      假设我有以下数据:

      class Route(models.Model):
          """
          Bus routes of İzmir.
          """
      
          code = models.PositiveSmallIntegerField(
              unique=True,
              primary_key=True,
              verbose_name="Code"
          )
      
          stops = models.ManyToManyField(
              Stop,
              null=True,
              blank=True,
              related_name="routes",
              verbose_name="Stops"
          )
      
          terminals = ArrayField(
              models.CharField(
                  null=False,
                  blank=False,
                  max_length=32,
              ),
              size=2,
              default=[],
              verbose_name="Terminals"
          )
      
          departure_times = ArrayField(
              ArrayField(
                  models.TimeField(
                      null=False,
                      blank=False
                  ),
                  null=True, # This was added later to maybe solve the problem.
                  default=[]
              ),
              default=[],
              size=6,
              verbose_name="Departure Times"
          )
      
          class Meta:
              verbose_name = "Route"
              verbose_name_plural = "Routes"
              ordering = ["code"]
      
      [
          [1, 2, 3],
          [4, 5],
          [6, 7, 8, 9, 10]
      ]
      
      def equalizer(data):
          largest_length = 0 # To define the largest length
      
          for l in data:
              if len(l) > largest_length:
                  largest_length = len(l) # Will define the largest length in data.
      
          for i, l in enumerate(data):
              if len(l) < largest_length:
                  remainder = largest_length - len(l) # Difference of length of particular list and largest length
                  data[i].extend([None for i in range(remainder)]) # Add None through the largest length limit
      
          return data
      
      期望输出为:

      [
          [1, 2, 3, None, None],
          [4, 5, None, None, None],
          [6, 7, 8, 9, 10]
      ]
      
      因此,我刚刚创建了一个示例函数,以备将来有人需要,如下所示:

      class Route(models.Model):
          """
          Bus routes of İzmir.
          """
      
          code = models.PositiveSmallIntegerField(
              unique=True,
              primary_key=True,
              verbose_name="Code"
          )
      
          stops = models.ManyToManyField(
              Stop,
              null=True,
              blank=True,
              related_name="routes",
              verbose_name="Stops"
          )
      
          terminals = ArrayField(
              models.CharField(
                  null=False,
                  blank=False,
                  max_length=32,
              ),
              size=2,
              default=[],
              verbose_name="Terminals"
          )
      
          departure_times = ArrayField(
              ArrayField(
                  models.TimeField(
                      null=False,
                      blank=False
                  ),
                  null=True, # This was added later to maybe solve the problem.
                  default=[]
              ),
              default=[],
              size=6,
              verbose_name="Departure Times"
          )
      
          class Meta:
              verbose_name = "Route"
              verbose_name_plural = "Routes"
              ordering = ["code"]
      
      [
          [1, 2, 3],
          [4, 5],
          [6, 7, 8, 9, 10]
      ]
      
      def equalizer(data):
          largest_length = 0 # To define the largest length
      
          for l in data:
              if len(l) > largest_length:
                  largest_length = len(l) # Will define the largest length in data.
      
          for i, l in enumerate(data):
              if len(l) < largest_length:
                  remainder = largest_length - len(l) # Difference of length of particular list and largest length
                  data[i].extend([None for i in range(remainder)]) # Add None through the largest length limit
      
          return data
      
      def均衡器(数据): 最大长度=0#定义最大长度 对于l in数据: 如果长度(l)>最大长度: 最大长度=len(l)#将定义数据中的最大长度。 对于枚举中的i,l(数据): 如果长度(l)<最大长度: 余数=最大长度-长度(l)#特定列表长度与最大长度之差 数据[i]。扩展([i在范围内为无(剩余)])#通过最大长度限制添加无 返回数据
      这样就没有任何
      DataError
      可显示。如果没有更好的解决方案,此答案将在两天内被接受为有效。

      感谢您分享您的解决方案,它确实帮助了我。然而,我相信我找到了一个更优雅的解决方案。他是我的看法:

          def save(self, *args, **kwargs):
               max_lenght = max(len(element) for element in self.NestedArrays)
               [[element.append(None) for _ in range(max_lenght - len(element))] for element in self.NestedArrays if len(element) != max_lenght]
               super(ParentClass, self).save(*args, **kwargs)  # Call the "real" save() method.
      
      基本上我覆盖了默认的save方法。然后修改NestedArrays属性并最终保存它。此方法将添加到存在此问题的模型类中。在这种情况下,我称之为父类

      有关重写模型方法的详细信息

      希望这对别人有帮助