首页 > 解决方案 > 如何自动填充来自其他模型的数据以及如何添加计算字段?

问题描述

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

  1. 在 modelRetrieve 中,与所选 imo 编号对应的名称字段。
  2. 使用当天加上 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']

标签: djangodjango-models

解决方案


要将默认值添加到未来 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
    ...

推荐阅读