1. """
    
  2. Many-to-one relationships
    
  3. 
    
  4. To define a many-to-one relationship, use ``ForeignKey()``.
    
  5. """
    
  6. from django.db import models
    
  7. 
    
  8. 
    
  9. class Reporter(models.Model):
    
  10.     first_name = models.CharField(max_length=30)
    
  11.     last_name = models.CharField(max_length=30)
    
  12.     email = models.EmailField()
    
  13. 
    
  14.     def __str__(self):
    
  15.         return "%s %s" % (self.first_name, self.last_name)
    
  16. 
    
  17. 
    
  18. class Article(models.Model):
    
  19.     headline = models.CharField(max_length=100)
    
  20.     pub_date = models.DateField()
    
  21.     reporter = models.ForeignKey(Reporter, models.CASCADE)
    
  22. 
    
  23.     class Meta:
    
  24.         ordering = ("headline",)
    
  25. 
    
  26.     def __str__(self):
    
  27.         return self.headline
    
  28. 
    
  29. 
    
  30. class Country(models.Model):
    
  31.     id = models.SmallAutoField(primary_key=True)
    
  32.     name = models.CharField(max_length=50)
    
  33. 
    
  34. 
    
  35. class City(models.Model):
    
  36.     id = models.BigAutoField(primary_key=True)
    
  37.     country = models.ForeignKey(
    
  38.         Country, models.CASCADE, related_name="cities", null=True
    
  39.     )
    
  40.     name = models.CharField(max_length=50)
    
  41. 
    
  42. 
    
  43. class District(models.Model):
    
  44.     city = models.ForeignKey(City, models.CASCADE, related_name="districts", null=True)
    
  45.     name = models.CharField(max_length=50)
    
  46. 
    
  47.     def __str__(self):
    
  48.         return self.name
    
  49. 
    
  50. 
    
  51. # If ticket #1578 ever slips back in, these models will not be able to be
    
  52. # created (the field names being lowercased versions of their opposite classes
    
  53. # is important here).
    
  54. class First(models.Model):
    
  55.     second = models.IntegerField()
    
  56. 
    
  57. 
    
  58. class Second(models.Model):
    
  59.     first = models.ForeignKey(First, models.CASCADE, related_name="the_first")
    
  60. 
    
  61. 
    
  62. # Protect against repetition of #1839, #2415 and #2536.
    
  63. class Third(models.Model):
    
  64.     name = models.CharField(max_length=20)
    
  65.     third = models.ForeignKey(
    
  66.         "self", models.SET_NULL, null=True, related_name="child_set"
    
  67.     )
    
  68. 
    
  69. 
    
  70. class Parent(models.Model):
    
  71.     name = models.CharField(max_length=20, unique=True)
    
  72.     bestchild = models.ForeignKey(
    
  73.         "Child", models.SET_NULL, null=True, related_name="favored_by"
    
  74.     )
    
  75. 
    
  76. 
    
  77. class ParentStringPrimaryKey(models.Model):
    
  78.     name = models.CharField(primary_key=True, max_length=15)
    
  79. 
    
  80. 
    
  81. class Child(models.Model):
    
  82.     name = models.CharField(max_length=20)
    
  83.     parent = models.ForeignKey(Parent, models.CASCADE)
    
  84. 
    
  85. 
    
  86. class ChildNullableParent(models.Model):
    
  87.     parent = models.ForeignKey(Parent, models.CASCADE, null=True)
    
  88. 
    
  89. 
    
  90. class ChildStringPrimaryKeyParent(models.Model):
    
  91.     parent = models.ForeignKey(ParentStringPrimaryKey, on_delete=models.CASCADE)
    
  92. 
    
  93. 
    
  94. class ToFieldChild(models.Model):
    
  95.     parent = models.ForeignKey(
    
  96.         Parent, models.CASCADE, to_field="name", related_name="to_field_children"
    
  97.     )
    
  98. 
    
  99. 
    
  100. # Multiple paths to the same model (#7110, #7125)
    
  101. class Category(models.Model):
    
  102.     name = models.CharField(max_length=20)
    
  103. 
    
  104.     def __str__(self):
    
  105.         return self.name
    
  106. 
    
  107. 
    
  108. class Record(models.Model):
    
  109.     category = models.ForeignKey(Category, models.CASCADE)
    
  110. 
    
  111. 
    
  112. class Relation(models.Model):
    
  113.     left = models.ForeignKey(Record, models.CASCADE, related_name="left_set")
    
  114.     right = models.ForeignKey(Record, models.CASCADE, related_name="right_set")
    
  115. 
    
  116.     def __str__(self):
    
  117.         return "%s - %s" % (self.left.category.name, self.right.category.name)
    
  118. 
    
  119. 
    
  120. # Test related objects visibility.
    
  121. class SchoolManager(models.Manager):
    
  122.     def get_queryset(self):
    
  123.         return super().get_queryset().filter(is_public=True)
    
  124. 
    
  125. 
    
  126. class School(models.Model):
    
  127.     is_public = models.BooleanField(default=False)
    
  128.     objects = SchoolManager()
    
  129. 
    
  130. 
    
  131. class Student(models.Model):
    
  132.     school = models.ForeignKey(School, models.CASCADE)