1. """
    
  2. The lookup API
    
  3. 
    
  4. This demonstrates features of the database API.
    
  5. """
    
  6. 
    
  7. from django.db import models
    
  8. from django.db.models.lookups import IsNull
    
  9. 
    
  10. 
    
  11. class Alarm(models.Model):
    
  12.     desc = models.CharField(max_length=100)
    
  13.     time = models.TimeField()
    
  14. 
    
  15.     def __str__(self):
    
  16.         return "%s (%s)" % (self.time, self.desc)
    
  17. 
    
  18. 
    
  19. class Author(models.Model):
    
  20.     name = models.CharField(max_length=100)
    
  21.     alias = models.CharField(max_length=50, null=True, blank=True)
    
  22. 
    
  23.     class Meta:
    
  24.         ordering = ("name",)
    
  25. 
    
  26. 
    
  27. class Article(models.Model):
    
  28.     headline = models.CharField(max_length=100)
    
  29.     pub_date = models.DateTimeField()
    
  30.     author = models.ForeignKey(Author, models.SET_NULL, blank=True, null=True)
    
  31.     slug = models.SlugField(unique=True, blank=True, null=True)
    
  32. 
    
  33.     class Meta:
    
  34.         ordering = ("-pub_date", "headline")
    
  35. 
    
  36.     def __str__(self):
    
  37.         return self.headline
    
  38. 
    
  39. 
    
  40. class Tag(models.Model):
    
  41.     articles = models.ManyToManyField(Article)
    
  42.     name = models.CharField(max_length=100)
    
  43. 
    
  44.     class Meta:
    
  45.         ordering = ("name",)
    
  46. 
    
  47. 
    
  48. class NulledTextField(models.TextField):
    
  49.     def get_prep_value(self, value):
    
  50.         return None if value == "" else value
    
  51. 
    
  52. 
    
  53. @NulledTextField.register_lookup
    
  54. class NulledTransform(models.Transform):
    
  55.     lookup_name = "nulled"
    
  56.     template = "NULL"
    
  57. 
    
  58. 
    
  59. @NulledTextField.register_lookup
    
  60. class IsNullWithNoneAsRHS(IsNull):
    
  61.     lookup_name = "isnull_none_rhs"
    
  62.     can_use_none_as_rhs = True
    
  63. 
    
  64. 
    
  65. class Season(models.Model):
    
  66.     year = models.PositiveSmallIntegerField()
    
  67.     gt = models.IntegerField(null=True, blank=True)
    
  68.     nulled_text_field = NulledTextField(null=True)
    
  69. 
    
  70.     class Meta:
    
  71.         constraints = [
    
  72.             models.UniqueConstraint(fields=["year"], name="season_year_unique"),
    
  73.         ]
    
  74. 
    
  75.     def __str__(self):
    
  76.         return str(self.year)
    
  77. 
    
  78. 
    
  79. class Game(models.Model):
    
  80.     season = models.ForeignKey(Season, models.CASCADE, related_name="games")
    
  81.     home = models.CharField(max_length=100)
    
  82.     away = models.CharField(max_length=100)
    
  83. 
    
  84. 
    
  85. class Player(models.Model):
    
  86.     name = models.CharField(max_length=100)
    
  87.     games = models.ManyToManyField(Game, related_name="players")
    
  88. 
    
  89. 
    
  90. class Product(models.Model):
    
  91.     name = models.CharField(max_length=80)
    
  92.     qty_target = models.DecimalField(max_digits=6, decimal_places=2)
    
  93. 
    
  94. 
    
  95. class Stock(models.Model):
    
  96.     product = models.ForeignKey(Product, models.CASCADE)
    
  97.     short = models.BooleanField(default=False)
    
  98.     qty_available = models.DecimalField(max_digits=6, decimal_places=2)
    
  99. 
    
  100. 
    
  101. class Freebie(models.Model):
    
  102.     gift_product = models.ForeignKey(Product, models.CASCADE)
    
  103.     stock_id = models.IntegerField(blank=True, null=True)
    
  104. 
    
  105.     stock = models.ForeignObject(
    
  106.         Stock,
    
  107.         from_fields=["stock_id", "gift_product"],
    
  108.         to_fields=["id", "product"],
    
  109.         on_delete=models.CASCADE,
    
  110.     )