como utilizar o nome de um model ForeignKey noutro model

16 views
Skip to first unread message

Aboim2

unread,
Nov 28, 2008, 12:09:28 PM11/28/08
to Django Brasil
Viva a todos,

Começo por pedir desculpa se o assunto não é muito esplicito.
O que pretendo fazer é uma ficha com três entradas que são:
Contacto, Cliente e Obra

Então o 'primary key' e o model Contacto
em seguida o model Cliente é um ForeignKey do model Contacto,
e a Obra seria um ForeignKey do model Cliente.

Mas para o model Obra só consigo fazer um ForeignKey do model Contacto

Alguem me indica a solução correcta??

Um abraço e obrigado
Carlos Aboim

Gustavo

unread,
Nov 28, 2008, 1:10:22 PM11/28/08
to django...@googlegroups.com
Não entendi muito bem sua pergunta não, mas vou tentar assim mesmo.

1 contato possui muitos clientes e 1 cliente possui muitas obras?

Se for assim:

class Contato(models.Model):
....

class Cliente(models.Model):
contato = models.ForeignKey(Contato)
...

class Obra(models.Model):
cliente = models.ForeignKey(Cliente)
...

não sei se é bem isso que deseja. tenta fazer uma busca no google por
normalizacao de dados.

t+

Carlos Aboim

unread,
Dec 1, 2008, 5:19:12 AM12/1/08
to django...@googlegroups.com


2008/11/28 Gustavo <gusta...@gmail.com>
Oi Gustavo,
Peço desculpa pela demora da resposta mas passei o FDS fora....

Quanto à questão:
1 Contacto tem apenas 1 cliente que é ele mesmo depois de comprar algo e se tornar cliente. Antes disso é apenas contacto.
Já quando passa de contacto a cliente pode ter ou não muitas obras.

1 Contacto  ---> 1 Cliente
2 Contacto  ---> 2 Cliente
... etc ...

1 Cliente  ---->  1 Obra
               ----> 2 Obra

2 Cliente  ---->  1 Obra
               ----> 2 Obra  


Obrigado
Carlos Aboim

Gustavo

unread,
Dec 1, 2008, 9:25:38 AM12/1/08
to django...@googlegroups.com
Então no caso o relacionamento entre contato e cliente é de 1 para 1 e
cliente e obra de 1 para muitos.

Sendo assim, ficaria:

class Contato(models.Model):
nome = models.CharField(max_length=100)
... outros campos aqui

class Cliente(models.Model):
contato = models.OneToOneField(Contato, primary_key=True)
... outros campos aqui

class Obra(models.Model):
cliente = models.ForeignKey(Cliente)

... outros campos aqui


Entretanto, dependendo do caso, ficaria mais simples de colocasse um
campo char na tabela Contato onde 'S' significa que o contato é
cliente e 'N' que não é cliente.

Abaixo a parte do manual do django que fala sobre relacionamento 1 para 1:

http://docs.djangoproject.com/en/dev/topics/db/models/#one-to-one-relationships
http://www.djangoproject.com/documentation/models/one_to_one/

t+

Carlos Aboim

unread,
Dec 2, 2008, 4:29:41 AM12/2/08
to django...@googlegroups.com


2008/12/1 Gustavo <gusta...@gmail.com>


Então no caso o relacionamento entre contato e cliente é de 1 para 1 e
cliente e obra de 1 para muitos.

Sendo assim, ficaria:

class Contato(models.Model):
 nome = models.CharField(max_length=100)
 ... outros campos aqui

class Cliente(models.Model):
 contato = models.OneToOneField(Contato, primary_key=True)
 ... outros campos aqui

class Obra(models.Model):
 cliente = models.ForeignKey(Cliente)
 ... outros campos aqui


Entretanto, dependendo do caso, ficaria mais simples de colocasse um
campo char na tabela Contato onde 'S' significa que o contato é
cliente e 'N' que não é cliente.

Oi Gustavo,
Tudo beleza até aqui, mas pretendo tambem
que na class Obra exista um campo cliente que tem que ser unica
como:
cliente = models.ForeignKey(Cliente)
mas esse procedimento levanta um 'TemplateSyntaxError at /admin/contactos/obra/add/'
quando adiciono uma nova obra.
Request Method: GET
Request URL: http://127.0.0.1:8000/admin/contactos/obra/add/
Exception Type: TemplateSyntaxError
Exception Value:
Caught an exception while rendering: no such column: contactos_cliente.nome_id
Exception Location: /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/template/debug.py in render_node, line 81

como posso contornar isto?

obrigado

Gustavo

unread,
Dec 2, 2008, 5:12:28 AM12/2/08
to django...@googlegroups.com
deleta as tabelas contato, clientes e obras no seu banco de dados,
depois executa o syncdb, teste pra ver se funcionou e caso não tenha
funcionado, envie o codigo do seu models.py no site http://dpaste.com/
e post aqui o link contendo seu codigo.

--
Gustavo Henrique
Tecnologia para Pequenas e Médias Empresas
http://www.gustavohenrique.net

Carlos Aboim

unread,
Dec 2, 2008, 5:46:04 AM12/2/08
to django...@googlegroups.com
2008/12/2 Gustavo <gusta...@gmail.com>

Oi mais uma vez,
Fiz um python manage.py sqlclear contactos e o server
fez um drop tables de todas a tabelas no banco de dados.
Mas não funcionou. Então como sugeriste, se puderes analisar o codigo.
http://dpaste.com/hold/95314/

um grande abraço para todos
Aboim2

Gustavo

unread,
Dec 2, 2008, 9:31:26 PM12/2/08
to django...@googlegroups.com
Criei um projeto novo e uma aplicacao chamada myapp. colei seu codigo
no models.py e funcionou. tive apenas que adicionar no settings.py em
INSTALLED_APPS o myprojeto.myapp.
com o syncdb criei as tabelas no mysql e no sqlite para testar. abaixo
o resultado no mysql:


mysql> desc myapp_cliente;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| nome_id | int(11) | NO | UNI | NULL | |
| email | varchar(75) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> desc myapp_contacto;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| nome | varchar(50) | NO | | NULL | |
| email | varchar(75) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> desc myapp_obra;
+------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| numero | int(11) | NO | PRI | NULL | |
| reg_data | date | NO | | NULL | |
| entrada | date | NO | | NULL | |
| saida | date | NO | | NULL | |
| nome_do_trabalho | varchar(80) | NO | | NULL | |
| preview | varchar(100) | NO | | NULL | |
| cliente_id | int(11) | NO | UNI | NULL | |
| vendedor_id | int(11) | NO | MUL | NULL | |
| descricao | longtext | NO | | NULL | |
+------------------+--------------+------+-----+---------+-------+
9 rows in set (0.00 sec)

Reply all
Reply to author
Forward
0 new messages