如何在Django中构造模型?

2024-05-16 10:08:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行一个使用Python(3.7)和Django(3)的项目,其中我必须创建一些模型来存储报告。有4种不同的模型来表示每种类型的报告,其中只有2个公共字段(RequestIdInstCode),但其余字段不同。最后,我必须在主页上显示最近的10份报告(来自所有型号的混合报告)

以下是我目前如何实现我的模型:

来自models.py:

class DistributionReport(models.Model):
    RequestId = models.CharField(max_length=256, blank=False, default=0)
    InstCode = models.CharField(max_length=3, blank=False)
    Currency = models.CharField(max_length=3, blank=False)
    Denomination = models.IntegerField(blank=False, default=0)decimal_places=2)
    date = models.DateField(default=datetime.date.today)

    class Meta:
        verbose_name = 'Distribution Report'

    def __str__(self):
        return self.RequestId


class ExpenditureReport(models.Model):
    RequestId = models.CharField(max_length=256, blank=False, default=0)
    InstCode = models.CharField(max_length=3, blank=False)
    StaffExpenditure = models.DecimalField(max_digits=12, decimal_places=2)
    Month = models.IntegerField(blank=False, default=0)
    Quarter = models.IntegerField(blank=False, default=0)
    Year = models.IntegerField(blank=False, default=0)

    class Meta:
        verbose_name = 'Expenditure Report'

    def __str__(self):
        return self.RequestId


class StorageReport(models.Model):
    RequestId = models.CharField(max_length=256, blank=False, default=0)
    InstCode = models.CharField(max_length=3, blank=False)
    Currency = models.CharField(max_length=5, blank=False)
    Denomination = models.IntegerField(blank=False, default=0)
    date = models.DateField(default=datetime.date.today)

    class Meta:
        verbose_name = 'Processing Report'

    def __str__(self):
        return self.RequestId


class AssetsReport(models.Model):
    RequestId = models.CharField(max_length=256, blank=False, default=0)
    InstCode = models.CharField(max_length=3, blank=False)
    AssetClassificationId = models.IntegerField(blank=False, default=0)
    VaultCapacity = models.DecimalField(max_digits=10, decimal_places=2)
    Year = models.IntegerField(blank=False, default=0)
    HalfOftheYear = models.IntegerField(blank=False, default=0)

    class Meta:
        verbose_name = 'Assets Report'

    def __str__(self):
        return self.RequestId

构造这些模型的最佳方法是什么,这样我就可以查询最近的报告(可以是任何类型的)


Tags: 模型selffalsedefaultmodelmodels报告length
1条回答
网友
1楼 · 发布于 2024-05-16 10:08:01

看看规范化是如何工作的,因为所有模型都有两个公共字段,假设您有一个名为Report的表,它有两个字段RequestIdInstCode。现在,您的所有其他模型都可以说处于XYZReport is a Report种关系中。
您可以使用OneTONE字段实现这一点,如下所示:

class Report(models.Model):
    RequestId = models.CharField(max_length=256, blank=False, default=0)
    InstCode = models.CharField(max_length=3, blank=False)
    DISTRIBUTION = 'DI'
    EXPENDITURE = 'EX'
    STORAGE = 'ST'
    ASSETS = 'AS'
    REPORT_TYPE_CHOICES = [
        (DISTRIBUTION, 'Distribution Report'),
        (EXPENDITURE, 'Expenditure Report'),
        (STORAGE, 'Storage Report'),
        (ASSETS, 'Assets Report'),
    ]
    report_type = models.CharField(
        max_length=2,
        choices=REPORT_TYPE_CHOICES,
        default=DISTRIBUTION,
    )
    # Any more common fields

class DistributionReport(models.Model):
    report = models.OneToOneField(
        Report,
        on_delete=models.CASCADE,
        related_name = 'distribution_report'
    )
    # Other fields

# Other Report models in similar fashion

现在,无论何时生成任何类型报告的对象,都要生成Report的对象,并将其分配给模型的报告属性。保存这两个模型,还要确定报表实例是哪种报表,请将相关报表类型添加到报表实例,如下所示:

report.report_type = Report.DISTRIBUTION # In case of Distribution Report

要确定报表实例是否属于特定类型,请执行以下操作:

report.report_type == report.DISTRIBUTION # will get whether Report is a DistributionReport

要获取特定类型对象,请使用OneToOne字段中设置的相关名称:

distribution_report = report.distribution_report

相关问题 更多 >