MCPcopy
hub / github.com/django/django / Case

Class Case

django/db/models/expressions.py:1717–1813  ·  view source on GitHub ↗

An SQL searched CASE expression: CASE WHEN n > 0 THEN 'positive' WHEN n < 0 THEN 'negative' ELSE 'zero' END

Source from the content-addressed store, hash-verified

1715
1716@deconstructible(path="django.db.models.Case")
1717class Case(SQLiteNumericMixin, Expression):
1718 """
1719 An SQL searched CASE expression:
1720
1721 CASE
1722 WHEN n > 0
1723 THEN 'positive'
1724 WHEN n < 0
1725 THEN 'negative'
1726 ELSE 'zero'
1727 END
1728 """
1729
1730 template = "CASE %(cases)s ELSE %(default)s END"
1731 case_joiner = " "
1732
1733 def __init__(self, *cases, default=None, output_field=None, **extra):
1734 if not all(isinstance(case, When) for case in cases):
1735 raise TypeError("Positional arguments must all be When objects.")
1736 super().__init__(output_field)
1737 self.cases = list(cases)
1738 self.default = self._parse_expressions(default)[0]
1739 self.extra = extra
1740
1741 def __str__(self):
1742 return "CASE %s, ELSE %r" % (
1743 ", ".join(str(c) for c in self.cases),
1744 self.default,
1745 )
1746
1747 def __repr__(self):
1748 return "<%s: %s>" % (self.__class__.__name__, self)
1749
1750 def get_source_expressions(self):
1751 return [*self.cases, self.default]
1752
1753 def set_source_expressions(self, exprs):
1754 *self.cases, self.default = exprs
1755
1756 def copy(self):
1757 c = super().copy()
1758 c.cases = c.cases[:]
1759 return c
1760
1761 def as_sql(
1762 self, compiler, connection, template=None, case_joiner=None, **extra_context
1763 ):
1764 connection.ops.check_expression_support(self)
1765 if not self.cases:
1766 return compiler.compile(self.default)
1767 template_params = {**self.extra, **extra_context}
1768 case_parts = []
1769 sql_params = []
1770 for case in self.cases:
1771 try:
1772 case_sql, case_params = compiler.compile(case)
1773 except EmptyResultSet:
1774 continue

Calls

no outgoing calls