models.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. """
  2. Many-to-one relationships
  3. To define a many-to-one relationship, use ``ForeignKey()``.
  4. """
  5. from django.db import models
  6. class Reporter(models.Model):
  7. first_name = models.CharField(max_length=30)
  8. last_name = models.CharField(max_length=30)
  9. email = models.EmailField()
  10. def __str__(self):
  11. return "%s %s" % (self.first_name, self.last_name)
  12. class Article(models.Model):
  13. headline = models.CharField(max_length=100)
  14. pub_date = models.DateField()
  15. reporter = models.ForeignKey(Reporter, models.CASCADE)
  16. def __str__(self):
  17. return self.headline
  18. class Meta:
  19. ordering = ('headline',)
  20. class City(models.Model):
  21. id = models.BigAutoField(primary_key=True)
  22. name = models.CharField(max_length=50)
  23. def __str__(self):
  24. return self.name
  25. class District(models.Model):
  26. city = models.ForeignKey(City, models.CASCADE, related_name='districts', null=True)
  27. name = models.CharField(max_length=50)
  28. def __str__(self):
  29. return self.name
  30. # If ticket #1578 ever slips back in, these models will not be able to be
  31. # created (the field names being lowercased versions of their opposite classes
  32. # is important here).
  33. class First(models.Model):
  34. second = models.IntegerField()
  35. class Second(models.Model):
  36. first = models.ForeignKey(First, models.CASCADE, related_name='the_first')
  37. # Protect against repetition of #1839, #2415 and #2536.
  38. class Third(models.Model):
  39. name = models.CharField(max_length=20)
  40. third = models.ForeignKey('self', models.SET_NULL, null=True, related_name='child_set')
  41. class Parent(models.Model):
  42. name = models.CharField(max_length=20, unique=True)
  43. bestchild = models.ForeignKey('Child', models.SET_NULL, null=True, related_name='favored_by')
  44. class Child(models.Model):
  45. name = models.CharField(max_length=20)
  46. parent = models.ForeignKey(Parent, models.CASCADE)
  47. class ToFieldChild(models.Model):
  48. parent = models.ForeignKey(Parent, models.CASCADE, to_field='name')
  49. # Multiple paths to the same model (#7110, #7125)
  50. class Category(models.Model):
  51. name = models.CharField(max_length=20)
  52. def __str__(self):
  53. return self.name
  54. class Record(models.Model):
  55. category = models.ForeignKey(Category, models.CASCADE)
  56. class Relation(models.Model):
  57. left = models.ForeignKey(Record, models.CASCADE, related_name='left_set')
  58. right = models.ForeignKey(Record, models.CASCADE, related_name='right_set')
  59. def __str__(self):
  60. return "%s - %s" % (self.left.category.name, self.right.category.name)
  61. # Test related objects visibility.
  62. class SchoolManager(models.Manager):
  63. def get_queryset(self):
  64. return super().get_queryset().filter(is_public=True)
  65. class School(models.Model):
  66. is_public = models.BooleanField(default=False)
  67. objects = SchoolManager()
  68. class Student(models.Model):
  69. school = models.ForeignKey(School, models.CASCADE)