Re: New to django and ORM. So a basic question about data inserts
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]: In [6]: r1 = Residence.objects.create(address='yyy', person=p) In [7]: r2 = Residence.objects.create(address='', 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]: In [12]: ResidenceDates.objects.create(person=p1, residence=res2, dates='2005-2008') Out[12]: In [13]: ResidenceDates.objects.create(person=p1, residence=res4, dates='2009-2017') Out[13]: In [15]: ResidenceDates.objects.create(person=p2, residence=res4, dates='2000-2001') Out[15]: In [16]: ResidenceDates.objects.create(person=p2, residence=res5, dates='2002-2010') Out[16]: In [17]: ResidenceDates.objects.create(person=p2, residence=res4, dates='2011-2016') Out[17]: Hope this help. Please read the django
Re: New to django and ORM. So a basic question about data inserts
-- The most dangerous phrase in the language is, "We've always done it this way." - Grace Hopper On 11 April 2017 at 05:35, Cassiumwrote: > 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? > > Have you read this part of the documentation? It describes exactly what you need: https://docs.djangoproject.com/en/1.11/topics/db/models/#extra-fields-on-many-to-many-relationships With regard to "how do I get the correct record written to the right table" you are putting the cart before the horse. The whole idea of an ORM is to disappear that type of consideration (despite it being exactly what *is* happening in the background). In the example of the documentation, when you create a Group, it is "saved to the correct table when you call the save() method (successfully)". When you create a Person, it is also saved to the correct table when you call the save() method. When you create a Membership that links to both the Person and the Group, it too is saved to the correct table when you call the save() method. Cheers L. -- 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 django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. 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/CAGBeqiPXxcm-OG8mD1PCo3%3Dx%2BmkUw1y5DthpQ-EOqAGios%3DQ8g%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
New to django and ORM. So a basic question about data inserts
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 django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. 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/2987a536-7d42-4440-ab56-e9a54326e4f9%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.