📜  django 为模型而不是表单设置默认值 - Python (1)

📅  最后修改于: 2023-12-03 15:30:29.870000             🧑  作者: Mango

以 Django 为模型而不是表单设置默认值

Django 是一个流行的 Python Web 框架,它提供了一个强大的模型层来处理数据。在 Django 中,我们通常使用表单来收集和验证用户输入,然后将其保存到数据库中。

有时我们需要在模型中设置默认值,而不是在表单中设置它们。这可能是因为我们希望在使用 Django 的后台管理功能进行数据录入时,对字段进行自动赋值,或者因为我们希望在逻辑上将默认值视为模型的属性,而不是表单的属性。在本文中,我们将探讨如何在 Django 模型中设置默认值。

设置默认值

在 Django 模型中设置默认值很简单。我们只需要在模型的字段定义中使用默认参数即可。例如,假设我们有一个模型 Book,其中一个字段是 published_date,我们希望将其默认设置为当前日期。我们可以这样定义字段:

from django.db import models
from datetime import date

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    published_date = models.DateField(default=date.today)

在上面的代码中,我们将 default 参数设置为 date.today,它将返回当前日期。这将使发布日期字段的默认值为当前日期。

我们也可以使用其他常量或函数来设置默认值。例如,我们可以将 published_date 设为 10 天后的日期:

from django.db import models
from datetime import date, timedelta

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)
    published_date = models.DateField(default=date.today()+timedelta(days=10))

在上面的代码中,我们将 default 参数设置为 date.today()+timedelta(days=10),它将返回当前日期加上 10 天后的日期。

设置有状态的默认值

有时候我们需要根据不同的条件为字段设置不同的默认值。在 Django 中,我们可以使用 default 参数的一个函数值来实现这个目的。该函数将在每次创建新的实例时调用,并根据条件返回不同的默认值。

例如,假设我们有一个模型 Order,其中一个字段是 status。我们希望在实例化订单时自动为其分配状态,如果订单总额大于 100 则分配为 "大订单",否则分配为 "小订单"。我们可以使用以下代码来实现:

class Order(models.Model):
    TOTAL_THRESHOLD = 100
    STATUS_SMALL_ORDER = 'S'
    STATUS_LARGE_ORDER = 'L'
    STATUS_CHOICES = [
        (STATUS_SMALL_ORDER, 'Small order'),
        (STATUS_LARGE_ORDER, 'Large order'),
    ]
    total = models.DecimalField(decimal_places=2, max_digits=5)
    status = models.CharField(max_length=1, choices=STATUS_CHOICES,
                              default=STATUS_SMALL_ORDER)

    def get_default_status(self):
        if self.total > self.TOTAL_THRESHOLD:
            return self.STATUS_LARGE_ORDER
        else:
            return self.STATUS_SMALL_ORDER

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.pk and not self.status:
            self.status = self.get_default_status()

在上面的代码中,我们定义了一个 get_default_status 方法来根据 total 字段的值来决定 status 字段的默认值。然后我们在模型的 __init__ 方法中检查 status 字段是否为空,如果是,则调用 get_default_status 方法来获取默认值。

结论

在 Django 中,我们可以使用 default 参数来设置字段的默认值。我们可以使用常量、函数和可调用的对象来设置默认值,以及根据字段的状态设置不同的默认值。这种灵活性使得我们可以在模型层面上轻松地处理字段的默认值,而不是在表单层面上处理它们。