models.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. from datetime import datetime
  2. from django.db import models
  3. # M2M described on one of the models
  4. class Person(models.Model):
  5. name = models.CharField(max_length=128)
  6. class Meta:
  7. ordering = ('name',)
  8. def __str__(self):
  9. return self.name
  10. class Group(models.Model):
  11. name = models.CharField(max_length=128)
  12. members = models.ManyToManyField(Person, through='Membership')
  13. custom_members = models.ManyToManyField(Person, through='CustomMembership', related_name="custom")
  14. nodefaultsnonulls = models.ManyToManyField(
  15. Person,
  16. through='TestNoDefaultsOrNulls',
  17. related_name="testnodefaultsnonulls",
  18. )
  19. class Meta:
  20. ordering = ('name',)
  21. def __str__(self):
  22. return self.name
  23. class Membership(models.Model):
  24. person = models.ForeignKey(Person, models.CASCADE)
  25. group = models.ForeignKey(Group, models.CASCADE)
  26. date_joined = models.DateTimeField(default=datetime.now)
  27. invite_reason = models.CharField(max_length=64, null=True)
  28. class Meta:
  29. ordering = ('date_joined', 'invite_reason', 'group')
  30. def __str__(self):
  31. return "%s is a member of %s" % (self.person.name, self.group.name)
  32. class CustomMembership(models.Model):
  33. person = models.ForeignKey(
  34. Person,
  35. models.CASCADE,
  36. db_column="custom_person_column",
  37. related_name="custom_person_related_name",
  38. )
  39. group = models.ForeignKey(Group, models.CASCADE)
  40. weird_fk = models.ForeignKey(Membership, models.SET_NULL, null=True)
  41. date_joined = models.DateTimeField(default=datetime.now)
  42. class Meta:
  43. db_table = "test_table"
  44. ordering = ["date_joined"]
  45. def __str__(self):
  46. return "%s is a member of %s" % (self.person.name, self.group.name)
  47. class TestNoDefaultsOrNulls(models.Model):
  48. person = models.ForeignKey(Person, models.CASCADE)
  49. group = models.ForeignKey(Group, models.CASCADE)
  50. nodefaultnonull = models.IntegerField()
  51. class PersonSelfRefM2M(models.Model):
  52. name = models.CharField(max_length=5)
  53. friends = models.ManyToManyField('self', through="Friendship", symmetrical=False)
  54. def __str__(self):
  55. return self.name
  56. class Friendship(models.Model):
  57. first = models.ForeignKey(PersonSelfRefM2M, models.CASCADE, related_name="rel_from_set")
  58. second = models.ForeignKey(PersonSelfRefM2M, models.CASCADE, related_name="rel_to_set")
  59. date_friended = models.DateTimeField()
  60. # Custom through link fields
  61. class Event(models.Model):
  62. title = models.CharField(max_length=50)
  63. invitees = models.ManyToManyField(
  64. Person, through='Invitation',
  65. through_fields=('event', 'invitee'),
  66. related_name='events_invited',
  67. )
  68. def __str__(self):
  69. return self.title
  70. class Invitation(models.Model):
  71. event = models.ForeignKey(Event, models.CASCADE, related_name='invitations')
  72. # field order is deliberately inverted. the target field is "invitee".
  73. inviter = models.ForeignKey(Person, models.CASCADE, related_name='invitations_sent')
  74. invitee = models.ForeignKey(Person, models.CASCADE, related_name='invitations')
  75. class Employee(models.Model):
  76. name = models.CharField(max_length=5)
  77. subordinates = models.ManyToManyField(
  78. 'self',
  79. through="Relationship",
  80. through_fields=('source', 'target'),
  81. symmetrical=False,
  82. )
  83. class Meta:
  84. ordering = ('pk',)
  85. def __str__(self):
  86. return self.name
  87. class Relationship(models.Model):
  88. # field order is deliberately inverted.
  89. another = models.ForeignKey(Employee, models.SET_NULL, related_name="rel_another_set", null=True)
  90. target = models.ForeignKey(Employee, models.CASCADE, related_name="rel_target_set")
  91. source = models.ForeignKey(Employee, models.CASCADE, related_name="rel_source_set")
  92. class Ingredient(models.Model):
  93. iname = models.CharField(max_length=20, unique=True)
  94. class Meta:
  95. ordering = ('iname',)
  96. class Recipe(models.Model):
  97. rname = models.CharField(max_length=20, unique=True)
  98. ingredients = models.ManyToManyField(
  99. Ingredient, through='RecipeIngredient', related_name='recipes',
  100. )
  101. class Meta:
  102. ordering = ('rname',)
  103. class RecipeIngredient(models.Model):
  104. ingredient = models.ForeignKey(Ingredient, models.CASCADE, to_field='iname')
  105. recipe = models.ForeignKey(Recipe, models.CASCADE, to_field='rname')