Hi,
Lets suppose we simplify your problem and we have these 2 django models:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=255, null=False, blank=False)
def __str__(self):
return self.name
class Residence(models.Model):
address = models.CharField(max_length=255, null=False, blank=False)
person = models.ForeignKey('Person', null=False, blank=False)
def __str__(self):
return '%s: %s' % (self.person.name, self.address) Notice I simplified the data so save in each model.
This is how you create data for these models. I ran these command in the django shell (python manage.py shell):
In [1]: from residence.models import Person, Residence
In [3]: p = Person.objects.create(name='Abu UIfreoledo')
In [4]: p
Out[4]: <Person: Abu UIfreoledo>
In [6]: r1 = Residence.objects.create(address='yyyyyyy', person=p)
In [7]: r2 = Residence.objects.create(address='cccc', person=p)
This is another way of creating and saving models:
In [8]: other_person = Person()
In [9]: other_person.name = 'Jekolaw Yhjosw'
In [10]: other_person.save()
In [11]: res1 = Residence()
In [12]: res1.address = 'keikdioekekdiekecnchdhwe'
In [13]: res1.person = other_person
In [14]: res1.save() Notice this generates these 2 tables in Postgres:
temp2=# \d residence_person
Table "public.residence_person"
Column | Type | Modifiers
--------+------------------------+---------------------------------------------------------------
id | integer | not null default nextval('residence_person_id_seq'::regclass)
name | character varying(255) | not null
Indexes:
"residence_person_pkey" PRIMARY KEY, btree (id)
Referenced by:
TABLE "residence_residence" CONSTRAINT "residence_residence_person_id_d4f422a8_fk_residence_person_id" FOREIGN KEY (person_id) REFERENCES residence_person(id) DEFERRABLE INITIALLY DEFERRED
temp2=# \d residence_residence
Table "public.residence_residence"
Column | Type | Modifiers
-----------+------------------------+------------------------------------------------------------------
id | integer | not null default nextval('residence_residence_id_seq'::regclass)
address | character varying(255) | not null
person_id | integer | not null
Indexes:
"residence_residence_pkey" PRIMARY KEY, btree (id)
"residence_residence_person_id_d4f422a8" btree (person_id)
Foreign-key constraints:
"residence_residence_person_id_d4f422a8_fk_residence_person_id" FOREIGN KEY (person_id) REFERENCES residence_person(id) DEFERRABLE INITIALLY DEFERRED
In this example the Residence instances are not reused or shared across Persons.
Now suppose one want to reuse the residences, meaning we will use 3 tables instead of 2, One for Persona, as before, one for Residence (without the foreign key to the Person) and a third relation to relate both and hold the dates.
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=255, null=False, blank=False)
residences = models.ManyToManyField('Residence', through='ResidenceDates')
def __str__(self):
return self.name
class Residence(models.Model):
address = models.CharField(max_length=255, null=False, blank=False)
def __str__(self):
return self.address
class ResidenceDates(models.Model):
dates = models.CharField(max_length=255, null=False, blank=False)
person = models.ForeignKey('Person', null=False, blank=False)
residence = models.ForeignKey('Residence', null=False, blank=False) Notice the join table ResidenceDates, it has foreign keys to both Person and Residence models. Also notices the many to many field. This generates the 3 tables you need (not shown here).
In [3]: p1 = Person.objects.create(name='p1')
In [4]: p2 = Person.objects.create(name='p2')
In [5]: p3 = Person.objects.create(name='p3')
In [6]: res1 = Residence.objects.create(address='a1')
In [7]: res2 = Residence.objects.create(address='a2')
In [8]: res3 = Residence.objects.create(address='a3')
In [9]: res4 = Residence.objects.create(address='a4')
In [10]: res5 = Residence.objects.create(address='a5')
In [11]: ResidenceDates.objects.create(person=p1, residence=res1, dates='2003-2005')
Out[11]: <ResidenceDates: ResidenceDates object>
In [12]: ResidenceDates.objects.create(person=p1, residence=res2, dates='2005-2008')
Out[12]: <ResidenceDates: ResidenceDates object>
In [13]: ResidenceDates.objects.create(person=p1, residence=res4, dates='2009-2017')
Out[13]: <ResidenceDates: ResidenceDates object>
In [15]: ResidenceDates.objects.create(person=p2, residence=res4, dates='2000-2001')
Out[15]: <ResidenceDates: ResidenceDates object>
In [16]: ResidenceDates.objects.create(person=p2, residence=res5, dates='2002-2010')
Out[16]: <ResidenceDates: ResidenceDates object>
In [17]: ResidenceDates.objects.create(person=p2, residence=res4, dates='2011-2016')
Out[17]: <ResidenceDates: ResidenceDates object>
Hope this help.
Please read the django tutorial and model documentation: