summaryrefslogtreecommitdiff
path: root/tests/field_defaults/models.py
diff options
context:
space:
mode:
authorIan Foote <python@ian.feete.org>2020-11-22 22:27:57 +0000
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-05-12 19:11:40 +0200
commit7414704e88d73dafbcfbb85f9bc54cb6111439d3 (patch)
treef51136b16e457d7f46e01ff3cc06308faf0923db /tests/field_defaults/models.py
parent599f3e2cda50ab084915ffd08edb5ad6cad61415 (diff)
Fixed #470 -- Added support for database defaults on fields.
Special thanks to Hannes Ljungberg for finding multiple implementation gaps. Thanks also to Simon Charette, Adam Johnson, and Mariusz Felisiak for reviews.
Diffstat (limited to 'tests/field_defaults/models.py')
-rw-r--r--tests/field_defaults/models.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/tests/field_defaults/models.py b/tests/field_defaults/models.py
index b95005192a..5f9c38a5a4 100644
--- a/tests/field_defaults/models.py
+++ b/tests/field_defaults/models.py
@@ -12,6 +12,8 @@ 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):
@@ -20,3 +22,45 @@ class Article(models.Model):
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
+ )