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:
- https://docs.djangoproject.com/en/1.11/intro/
- https://docs.djangoproject.com/en/1.11/topics/db/models/
-
http://localhost/Python/django-docs-1.10-en/topics/db/models.html#extra-fields-on-many-to-many-relationships
- here explains the many to many field you need.
On Monday, April 10, 2017 at 3:35:59 PM UTC-4, Cassium wrote:
>
> Say I am collecting residence history and I allow the user to submit up to
> five previous addresses. I have a PEOPLE model and RESIDENCES model and
> anticipate a many-to-many relationship between. Back when I was working
> with Joomla I would have manages these models (well, tables) with a table
> in the middle called PEOPLE_RESIDENCES which would have also included the
> dates of that relationship. And I understand that I can do that with a
> model and the 'through' statement.
>
> But here is where I'm lost. When I get a form submitted from the user, how
> do I get all the correct rows written to the various tables. Assume for
> simplicity sake that I have a new person being submitted as follows
>
> PERSON
> --RESIDENCE 1, 2005-2008
> --RESIDENCE 2, 2008-2011
> --RESIDENCE 3, 2012-2016
>
> So I would need one new row on the PEOPLE table, three new rows on the
> PEOPLE_RESIDENCES table and up to three new rows on the RESIDENCES table.
> I'm lost on how the necessary rows are added to the PEOPLE_RESIDENCES
> table. Is there some sort of value returned from the create/insert
> statements or do I send the ORM a structured object which manages all of
> the INSERTS including the relatioinships? Or is there something else I have
> to do?
>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/92385a74-1118-44cd-b568-d76bda7dc011%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.