python - django 模型选择未填充数据库
问题描述
我有以下代码:
class ReportType(models.Model):
REPORT_TYPE_CHOICES = (
('E', 'Earnings'),
('MA', 'Monthly announcement'),
('WA', 'Weekly announcement'),
('SA', 'Sales announcement'),
)
report_type = models.CharField(
max_length=50,
choices=REPORT_TYPE_CHOICES,
default="Earnings"
)
def __str__(self):
return self.report_type
这只是模型类之一,其中包括一个字段的选择属性。但是,当执行“makemigrations”然后“迁移”时,管理工具会创建数据库表,但不会使用它应该执行的选择中的数据填充数据库表属性。结果是,当我在模型中使用此模型时,单击表单中的下拉框时会得到一个空的下拉列表。
几乎所有包含选择字段的模型类都会出现此问题,但其中一个模型类实际上正在工作,但除了实际选择中的不同内容外,它具有相同的代码。
有人知道为什么 django 管理工具没有将选择属性中的数据填充到数据库表中吗?我看不出代码有任何问题。
编辑:报告类的模型形式:
class ReportForm(ModelForm):
class Meta:
model = Report
fields = ['profile', 'name', 'report_type', 'time_period', 'link']
ReportType 本身没有附加模型表单,但它是 Report 类中的外键。
报告模型具有以下代码:
class Report(models.Model):
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
report_type = models.ForeignKey(ReportType)
time_period = models.ForeignKey(ReportTimePeriod)
link = models.URLField(max_length=500)
report_conclusion = models.CharField(max_length=500, default="No conclusion yet")
market_reaction = models.CharField(max_length=500, default="No market reaction yet")
ReportTimePeriod 在其中一个属性中还有一个选项列表,因此我希望它也可以在那里填充数据库。
解决方案
您误解了事情的工作方式,ModelForm
您的Report
模型将寻找ReportType
实例以预先填充 html 模板中的选择。您需要先创建ReportType
实例。
从您的ReportType
模型和您的问题来看,我假设您认为 Django 将为ReportType
每个创建一个实例,REPORT_TYPE_CHOICES
但事实并非如此。字段中的choices
属性用于验证目的。如果你想保持你的模型像现在一样,你需要为ReportType
每个REPORT_TYPE_CHOICES
值创建一个实例。
现在,除非您有充分的理由拥有模型,否则您可以通过以下方式ReportType
更改模型:Report
REPORT_TYPE_CHOICES = (
('E', 'Earnings'),
('MA', 'Monthly announcement'),
('WA', 'Weekly announcement'),
('SA', 'Sales announcement'),
)
class Report(models.Model):
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
report_type = models.CharField(
max_length=50,
choices=REPORT_TYPE_CHOICES,
default="E" # note we use the Key here
)
time_period = models.ForeignKey(ReportTimePeriod)
link = models.URLField(max_length=500)
report_conclusion = models.CharField(max_length=500, default="No conclusion yet")
market_reaction = models.CharField(max_length=500, default="No market reaction yet")
推荐阅读
- c - 如何在 C 中反转 16 位十六进制值?
- android - 无法启动 Appium 设置应用程序:5071 毫秒后未满足条件。超时
- html - 结构指令传递 Html Elements 属性值
- apache-kafka - 使用 SLF4j 为 Apache Beam 和 Kafka 客户端配置日志记录
- rust - link-arg 没有将编译器选项传递给 rustc
- laravel - 尝试从多对多关系 laravel 获取数据时,在字段列表中显示列“user_id”不明确
- reactjs - Reactjs - 我可以在我网站的所有页面中使用来自 AWS Amplify 的 Auth.authenticatedUser 函数吗?
- bash - 多个文件的 Gnuplot 脚本
- tensorflow - 通过 keras 和张量流的 LPR/ANPR
- python - Python 问题在脚本中导入我的文件(不在控制台中)