1. """
    
  2. One-to-one relationships
    
  3. 
    
  4. To define a one-to-one relationship, use ``OneToOneField()``.
    
  5. 
    
  6. In this example, a ``Place`` optionally can be a ``Restaurant``.
    
  7. """
    
  8. from django.db import models
    
  9. 
    
  10. 
    
  11. class Place(models.Model):
    
  12.     name = models.CharField(max_length=50)
    
  13.     address = models.CharField(max_length=80)
    
  14. 
    
  15.     def __str__(self):
    
  16.         return "%s the place" % self.name
    
  17. 
    
  18. 
    
  19. class Restaurant(models.Model):
    
  20.     place = models.OneToOneField(Place, models.CASCADE, primary_key=True)
    
  21.     serves_hot_dogs = models.BooleanField(default=False)
    
  22.     serves_pizza = models.BooleanField(default=False)
    
  23. 
    
  24.     def __str__(self):
    
  25.         return "%s the restaurant" % self.place.name
    
  26. 
    
  27. 
    
  28. class Bar(models.Model):
    
  29.     place = models.OneToOneField(Place, models.CASCADE)
    
  30.     serves_cocktails = models.BooleanField(default=True)
    
  31. 
    
  32. 
    
  33. class UndergroundBar(models.Model):
    
  34.     place = models.OneToOneField(Place, models.SET_NULL, null=True)
    
  35.     serves_cocktails = models.BooleanField(default=True)
    
  36. 
    
  37. 
    
  38. class Waiter(models.Model):
    
  39.     restaurant = models.ForeignKey(Restaurant, models.CASCADE)
    
  40.     name = models.CharField(max_length=50)
    
  41. 
    
  42.     def __str__(self):
    
  43.         return "%s the waiter at %s" % (self.name, self.restaurant)
    
  44. 
    
  45. 
    
  46. class Favorites(models.Model):
    
  47.     name = models.CharField(max_length=50)
    
  48.     restaurants = models.ManyToManyField(Restaurant)
    
  49. 
    
  50. 
    
  51. class ManualPrimaryKey(models.Model):
    
  52.     primary_key = models.CharField(max_length=10, primary_key=True)
    
  53.     name = models.CharField(max_length=50)
    
  54. 
    
  55. 
    
  56. class RelatedModel(models.Model):
    
  57.     link = models.OneToOneField(ManualPrimaryKey, models.CASCADE)
    
  58.     name = models.CharField(max_length=50)
    
  59. 
    
  60. 
    
  61. class MultiModel(models.Model):
    
  62.     link1 = models.OneToOneField(Place, models.CASCADE)
    
  63.     link2 = models.OneToOneField(ManualPrimaryKey, models.CASCADE)
    
  64.     name = models.CharField(max_length=50)
    
  65. 
    
  66.     def __str__(self):
    
  67.         return "Multimodel %s" % self.name
    
  68. 
    
  69. 
    
  70. class Target(models.Model):
    
  71.     name = models.CharField(max_length=50, unique=True)
    
  72. 
    
  73. 
    
  74. class Pointer(models.Model):
    
  75.     other = models.OneToOneField(Target, models.CASCADE, primary_key=True)
    
  76. 
    
  77. 
    
  78. class Pointer2(models.Model):
    
  79.     other = models.OneToOneField(Target, models.CASCADE, related_name="second_pointer")
    
  80. 
    
  81. 
    
  82. class HiddenPointer(models.Model):
    
  83.     target = models.OneToOneField(Target, models.CASCADE, related_name="hidden+")
    
  84. 
    
  85. 
    
  86. class ToFieldPointer(models.Model):
    
  87.     target = models.OneToOneField(
    
  88.         Target, models.CASCADE, to_field="name", primary_key=True
    
  89.     )
    
  90. 
    
  91. 
    
  92. # Test related objects visibility.
    
  93. class SchoolManager(models.Manager):
    
  94.     def get_queryset(self):
    
  95.         return super().get_queryset().filter(is_public=True)
    
  96. 
    
  97. 
    
  98. class School(models.Model):
    
  99.     is_public = models.BooleanField(default=False)
    
  100.     objects = SchoolManager()
    
  101. 
    
  102. 
    
  103. class DirectorManager(models.Manager):
    
  104.     def get_queryset(self):
    
  105.         return super().get_queryset().filter(is_temp=False)
    
  106. 
    
  107. 
    
  108. class Director(models.Model):
    
  109.     is_temp = models.BooleanField(default=False)
    
  110.     school = models.OneToOneField(School, models.CASCADE)
    
  111.     objects = DirectorManager()