gpt4 book ai didi

python - CharField(editable=False),默认使用局部变量

转载 作者:太空宇宙 更新时间:2023-11-03 20:06:57 26 4
gpt4 key购买 nike

我是 django 新手,正在尝试弄清楚如何将特定字段添加到 django 模型中。我想上传 csv 文档并保存其标题。正如您所看到的,我想使用随文档发送的 header ,或者如果未发送 header ,则使用文档第一行中的 header 。

from django.db import models

class CSV_API_DB(models.Model):
headers = models.CharField(max_length=250, blank=True)
delimiter = models.CharField(max_length=1, default=';')
filefield = models.FileField(upload_to='uploads/', max_length=100, default='empty')

actual_headers = ''

def __str__(self):
actual_headers = ''

if not self.headers:
file_path = str(self.filefield)
file = open(file_path)
for line in file:
string_line = str(line[:-1])
actual_headers = string_line.split(self.delimiter)
break

else:
actual_headers = self.headers.split(self.delimiter)
return str(actual_headers)


true_headers = models.CharField(max_length=250, default = str(actual_headers), editable=False)

问题似乎是, true_headers 不会被“__ str __”函数覆盖,因为数据库中 true_headers 的值始终只是空字符串。

最佳答案

default 参数在迁移过程中被调用,但在创建新对象时不会被调用。要提供动态默认值,您应该将可调用对象传递给 default= arg。

因此,要提供动态默认值,您需要传递一个返回它的函数,而不仅仅是字符串。像这样:

...
some_field = fields.CharField(max_length=10, default=get_some_field) # note that no () after function name

def get_some_field():
return some_dynamic_value

但请注意,您无法从被调用的函数访问模型实例,因此如果可能的话,您必须使用 YourModel.objects.get(...) 搜索它,或者仅使用其他方式设置动态值。例如,您可以重写 save() 方法:

class CSV_API_DB(models.Model):
...
def save(self, *args, **kwargs):
if not self.true_headers and self._state.adding: # _state.adding indicates that object is being created (not just edited), so we have to set default value if none provided
self.true_headers = self.headers.split(self.delimiter)
super().save(*args, **kwargs)

关于python - CharField(editable=False),默认使用局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58926104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com