summaryrefslogtreecommitdiff
path: root/tests/field_defaults/models.py
blob: 5f9c38a5a4215d6c1e680404bd8b50810aaccf15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""
Callable defaults

You can pass callable objects as the ``default`` parameter to a field. When
the object is created without an explicit value passed in, Django will call
the method to determine the default value.

This example uses ``datetime.datetime.now`` as the default for the ``pub_date``
field.
"""

from datetime import datetime

from django.db import models
from django.db.models.functions import Coalesce, ExtractYear, Now, Pi
from django.db.models.lookups import GreaterThan


class Article(models.Model):
    headline = models.CharField(max_length=100, default="Default headline")
    pub_date = models.DateTimeField(default=datetime.now)

    def __str__(self):
        return self.headline


class DBArticle(models.Model):
    """
    Values or expressions can be passed as the db_default parameter to a field.
    When the object is created without an explicit value passed in, the
    database will insert the default value automatically.
    """

    headline = models.CharField(max_length=100, db_default="Default headline")
    pub_date = models.DateTimeField(db_default=Now())

    class Meta:
        required_db_features = {"supports_expression_defaults"}


class DBDefaults(models.Model):
    both = models.IntegerField(default=1, db_default=2)
    null = models.FloatField(null=True, db_default=1.1)


class DBDefaultsFunction(models.Model):
    number = models.FloatField(db_default=Pi())
    year = models.IntegerField(db_default=ExtractYear(Now()))
    added = models.FloatField(db_default=Pi() + 4.5)
    multiple_subfunctions = models.FloatField(db_default=Coalesce(4.5, Pi()))
    case_when = models.IntegerField(
        db_default=models.Case(models.When(GreaterThan(2, 1), then=3), default=4)
    )

    class Meta:
        required_db_features = {"supports_expression_defaults"}


class DBDefaultsPK(models.Model):
    language_code = models.CharField(primary_key=True, max_length=2, db_default="en")


class DBDefaultsFK(models.Model):
    language_code = models.ForeignKey(
        DBDefaultsPK, db_default="fr", on_delete=models.CASCADE
    )