Python Django中不规则嵌入阵列字段的处理
我目前正在将Django与PostgreSQL一起使用。我使用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 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属性并最终保存它。此方法将添加到存在此问题的模型类中。在这种情况下,我称之为父类
有关重写模型方法的详细信息
希望这对别人有帮助