python - CharField(editable=False) 局部变量为默认值
问题描述
我是 django 新手,正在尝试弄清楚如何将特定字段添加到 django 模型中。我想上传一个 csv 文档并保存它的标题。如您所见,我想使用随文档一起发送的标题,或者如果它们未发送,则使用文档第一行中的标题。
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)
推荐阅读
- javascript - React 错误边界不适用于 React
- javascript - 对在哪里寻找@pnp 完整文档感到困惑
- javascript - 当我多次运行相同的函数时,我得到了多个 setInterval 实例?
- mysql - MySQL - Docker Image:如何等到表被填充后再启动下一个容器
- flutter - Flutter 同步 LocalDB 和 RemoteDB
- r - For循环对R中矩阵的每一列求和
- php - 按元数据字段查询产品的 SKU?
- php - 如何使用jquery计算php中两个日期之间的差异
- python - matplotlib 在带有 TkAgg 后端的 macOS 上的 plt.show() 中崩溃
- java - 使用 Spark 定义具有数字列表及其相关概率的随机变量