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

我正在学习django,但在模型许可范围内,我无法正确完成两件事:

  • 在模型中检索与所选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']
    
    来自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
        ...