django - 如何自动填充来自其他模型的数据以及如何添加计算字段?
问题描述
我正在学习 django,但在模型许可范围内我无法正确做两件事:
- 在 modelRetrieve 中,与所选 imo 编号对应的名称字段。
- 使用当天加上 7 天自动填充日期字段。
任何想法我做错了什么?这是我的代码:
from django.db import models
from django.core.exceptions import ValidationError
from django.utils import timezone
from datetime import timedelta, datetime
def imo_validator(value):
if value < 0 or value > 9999999:
raise ValidationError(
'This is not a valid IMO number',
params={'value':value},
)
class ship(models.Model):
imo = models.IntegerField(unique=True,validators=[imo_validator])
name = models.CharField(max_length=20)
rpm = models.FloatField()
power = models.FloatField()
main_engine = models.IntegerField()
class Meta:
ordering = ['imo']
def __str__(self):
return "{}, (IMO:{})".format(self.name, self.imo)
class clearance(models.Model):
STATUSES = [
('PENDING','PENDING'),
('REJECTED','REJECTED'),
('APPROVED','APPROVED'),
]
PORTS = [
('PACAN','PACAN'),
('PABLB','PABLB'),
('PACCT','PACCT'),
('PAANP','PAANP'),
('PAANA','PAANA'),
]
date_of_request = models.DateField(default=timezone.now,blank=False,editable=True)
imo = models.ForeignKey(ship, on_delete=models.PROTECT)
port = models.CharField(max_length=20,null=True,choices=PORTS)
eta = models.DateField(null=False)
name = ship.name.get(imo=imo)
calculated_eta = models.DateField(datetime.today + timedelta(days=1))
aduanas = models.FileField(blank=True)
aduanas_ok = models.CharField(max_length=15,default='PENDING',choices=STATUSES,editable=False)
minsa = models.FileField(blank=True)
minsa_ok = models.CharField(max_length=15,default='PENDING',choices=STATUSES,editable=False)
def __str__(self):
return "{}, ETA:{}".format(self.imo, self.eta)
class Meta:
ordering = ['eta']
解决方案
要将默认值添加到未来 7 天的 DateField,您需要创建一个返回未来 7 天日期的函数,然后将其传递给字段的“默认”参数
def seven_days_from_now():
return datetime.date.today() + datetime.timedelta(days=7)
class clearance(models.Model):
...
calculated_eta = models.DateField(default=seven_days_from_now)
...
您的“名称”字段应该是返回关联“imo”名称的属性
class clearance(models.Model):
...
@property
def name(self):
return self.imo.name
...
推荐阅读
- symfony - symfony 2.8 如何获取具有当前登录用户认证的多个扇区列表
- javascript - 错误:
属性 y1:预期长度,“{{iy}}”。错误显示在 chrome 控制台中,但 svg 工作正常 - javascript - Vuex 更新数组作为对象的值
- php - 带有 PHP 的 Youtube Scraper
- javascript - chrome 扩展代码来获取当前活动的标签 url 并检测其中的任何 url 更新
- java - 是否可以说服 Swing 缓存使用jTable 单元格中的标记加载的图像,而不是在每次重绘时重新下载图像?
- ibm-mq - 连接到云上的 IBM MQ 的问题
- c# - 如何在 C# 中使用 HTML+CSS 生成 Excel 文件
- javascript - 检测用户是否使用键或鼠标执行粘贴
- regex - regexp_replace 的困难