1. import datetime
    
  2. 
    
  3. from django.db import models
    
  4. 
    
  5. 
    
  6. class Country(models.Model):
    
  7.     # Table Column Fields
    
  8.     name = models.CharField(max_length=50)
    
  9. 
    
  10.     def __str__(self):
    
  11.         return self.name
    
  12. 
    
  13. 
    
  14. class Person(models.Model):
    
  15.     # Table Column Fields
    
  16.     name = models.CharField(max_length=128)
    
  17.     person_country_id = models.IntegerField()
    
  18. 
    
  19.     # Relation Fields
    
  20.     person_country = models.ForeignObject(
    
  21.         Country,
    
  22.         from_fields=["person_country_id"],
    
  23.         to_fields=["id"],
    
  24.         on_delete=models.CASCADE,
    
  25.     )
    
  26.     friends = models.ManyToManyField("self", through="Friendship", symmetrical=False)
    
  27. 
    
  28.     class Meta:
    
  29.         ordering = ("name",)
    
  30. 
    
  31.     def __str__(self):
    
  32.         return self.name
    
  33. 
    
  34. 
    
  35. class Group(models.Model):
    
  36.     # Table Column Fields
    
  37.     name = models.CharField(max_length=128)
    
  38.     group_country = models.ForeignKey(Country, models.CASCADE)
    
  39.     members = models.ManyToManyField(
    
  40.         Person, related_name="groups", through="Membership"
    
  41.     )
    
  42. 
    
  43.     class Meta:
    
  44.         ordering = ("name",)
    
  45. 
    
  46.     def __str__(self):
    
  47.         return self.name
    
  48. 
    
  49. 
    
  50. class Membership(models.Model):
    
  51.     # Table Column Fields
    
  52.     membership_country = models.ForeignKey(Country, models.CASCADE)
    
  53.     date_joined = models.DateTimeField(default=datetime.datetime.now)
    
  54.     invite_reason = models.CharField(max_length=64, null=True)
    
  55.     person_id = models.IntegerField()
    
  56.     group_id = models.IntegerField(blank=True, null=True)
    
  57. 
    
  58.     # Relation Fields
    
  59.     person = models.ForeignObject(
    
  60.         Person,
    
  61.         from_fields=["person_id", "membership_country"],
    
  62.         to_fields=["id", "person_country_id"],
    
  63.         on_delete=models.CASCADE,
    
  64.     )
    
  65.     group = models.ForeignObject(
    
  66.         Group,
    
  67.         from_fields=["group_id", "membership_country"],
    
  68.         to_fields=["id", "group_country"],
    
  69.         on_delete=models.CASCADE,
    
  70.     )
    
  71. 
    
  72.     class Meta:
    
  73.         ordering = ("date_joined", "invite_reason")
    
  74. 
    
  75.     def __str__(self):
    
  76.         group_name = self.group.name if self.group_id else "NULL"
    
  77.         return "%s is a member of %s" % (self.person.name, group_name)
    
  78. 
    
  79. 
    
  80. class Friendship(models.Model):
    
  81.     # Table Column Fields
    
  82.     from_friend_country = models.ForeignKey(
    
  83.         Country, models.CASCADE, related_name="from_friend_country"
    
  84.     )
    
  85.     from_friend_id = models.IntegerField()
    
  86.     to_friend_country_id = models.IntegerField()
    
  87.     to_friend_id = models.IntegerField()
    
  88. 
    
  89.     # Relation Fields
    
  90.     from_friend = models.ForeignObject(
    
  91.         Person,
    
  92.         on_delete=models.CASCADE,
    
  93.         from_fields=["from_friend_country", "from_friend_id"],
    
  94.         to_fields=["person_country_id", "id"],
    
  95.         related_name="from_friend",
    
  96.     )
    
  97. 
    
  98.     to_friend_country = models.ForeignObject(
    
  99.         Country,
    
  100.         from_fields=["to_friend_country_id"],
    
  101.         to_fields=["id"],
    
  102.         related_name="to_friend_country",
    
  103.         on_delete=models.CASCADE,
    
  104.     )
    
  105. 
    
  106.     to_friend = models.ForeignObject(
    
  107.         Person,
    
  108.         from_fields=["to_friend_country_id", "to_friend_id"],
    
  109.         to_fields=["person_country_id", "id"],
    
  110.         related_name="to_friend",
    
  111.         on_delete=models.CASCADE,
    
  112.     )