models.py 4.5 KB

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