Django 如何从其他模型自动填充数据以及如何添加计算字段?
我正在学习django,但在模型许可范围内,我无法正确完成两件事:Django 如何从其他模型自动填充数据以及如何添加计算字段?,django,django-models,Django,Django Models,我正在学习django,但在模型许可范围内,我无法正确完成两件事: 在模型中检索与所选imo编号对应的名称字段 自动填充当前日期加上7天的日期字段 你知道我做错了什么吗?这是我的密码: from django.db import models from django.core.exceptions import ValidationError from django.utils import timezone from datetime import timedelta, datetime d
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']
来自django.db导入模型的
从django.core.exceptions导入ValidationError
从django.utils导入时区
从datetime导入timedelta,datetime
def imo_验证器(值):
如果值<0或值>9999999:
引发验证错误(
'这不是有效的IMO编号',
params={'value':value},
)
船舶等级(型号.型号):
imo=models.IntegerField(unique=True,validators=[imo\u validator])
name=models.CharField(最大长度=20)
rpm=models.FloatField()
power=models.FloatField()
main_engine=models.IntegerField()
类元:
排序=['imo']
定义(自我):
返回“{},(IMO:{})”.format(self.name,self.IMO)
舱位净空(型号.型号):
状态=[
(‘待定’,‘待定’),
(“拒绝”、“拒绝”),
(“已批准”、“已批准”),
]
端口=[
('PACAN','PACAN'),
('PABLB','PABLB'),
(‘PACCT’,‘PACCT’),
(‘PAANP’,‘PAANP’),
('PAANA','PAANA'),
]
请求的日期=模型。日期字段(默认值=时区。现在,空白值=假,可编辑值=真)
imo=型号。外键(船上,删除=型号。保护)
port=models.CharField(最大长度=20,null=True,选项=port)
eta=models.DateField(null=False)
name=ship.name.get(imo=imo)
计算的时间=models.DateField(datetime.today+timedelta(days=1))
aduanas=models.FileField(blank=True)
aduanas_ok=models.CharField(最大长度=15,默认为挂起),选项=status,可编辑=False)
minsa=models.FileField(blank=True)
minsa_ok=models.CharField(最大长度=15,默认值为'PENDING',选项=status,可编辑=False)
定义(自我):
返回“{},ETA:{}”。格式(self.imo,self.ETA)
类元:
排序=['eta']
要将默认值添加到未来7天的日期字段,需要创建一个函数,返回未来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
...