On 04/16/2011 04:35 PM, Guevara wrote:
Hello!
I have two class, Person and employee, i need make a composition for
this (Prefer composition over inheritance):

class Person(models.Model):
     name = models.CharField(max_length=50)
     date_inclusion = models.DateField()
     # others fields

class Employee(models.Model):
     person = models.OneToOneField(Person, primary_key=True)
     address = models.OneToOneField(Address, primary_key=True)


The SQL generate is:


BEGIN;
CREATE TABLE "person_person" (
     "id" serial NOT NULL PRIMARY KEY,
     "name" varchar(50) NOT NULL,
     "date_inclusion" date NOT NULL,
)
;
CREATE TABLE "employee_employee" (
     "person_id" integer NOT NULL PRIMARY KEY,
     "address_id" integer NOT NULL PRIMARY KEY,
)
;


This is correct? Should generate the id of the employee?
Proxy models could be used for this case?

Thanks!


It's correct in that Django has done exactly what you've told it you want, but I doubt that what you've told it is what you REALLY want.

If your goal is to have an employee object that has direct access to all of its related person object, and whose only new data field is a reference to an address object, then you should change the Employee model to this:

class Address(models.Model):
    pass

class Person(models.Model):
    name = models.CharField(max_length=50)
    date_inclusion = models.DateField()

class Employee(models.Model):
    person = models.OneToOneField(Person)
    address = models.ForeignKey(Address)


This will change the generated employee table to something like this (for 
SQLite3):

CREATE TABLE "foo_address" (
    "id" integer NOT NULL PRIMARY KEY
)
;
CREATE TABLE "foo_person" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL,
    "date_inclusion" date NOT NULL
)
;
CREATE TABLE "foo_employee" (
    "id" integer NOT NULL PRIMARY KEY,
    "person_id" integer NOT NULL UNIQUE REFERENCES "foo_person" ("id"),
    "address_id" integer NOT NULL REFERENCES "foo_address" ("id")
)
;
CREATE INDEX "foo_employee_b213c1e9" ON "foo_employee" ("address_id");


With these models, every Employee object will have an equivalent Person object 
(though you may have Persons without corresponding Employees).  You can then 
use these models as follows:

(InteractiveConsole)
 from foo.models import *
 from datetime import datetime
 now = datetime.now()
 p = Person( name='Tom', date_inclusion=now )
 p.save()
 a = Address()
 a.save()
 e = Employee( person=p, address=a )
 e.save()
 e.person.name
'Tom'

- Craig -

--
You received this message because you are subscribed to the Google Groups "Django 
users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to