Auto relacionamento

233 views
Skip to first unread message

m@nu

unread,
Dec 14, 2007, 9:39:50 PM12/14/07
to Django Brasil
Olá pessoal tudo bom.

Alguém tem algum material ou maiores explicações quanto a este
assunto?

Estou tendo algumas dificuldades em relação a isto.

no caso o q ocorre é q na tabelaA tenho FK de tabelaB e na tabelaB o
inverso.

Mas o django no modelo da erro no modelo primeiro tenho q colocar a
tabela q vai ter fk na proxima.

Como as duas tabelas que estou trabalhando tem um auto relacionamento
o q me dizem.

Andrews Medina

unread,
Dec 14, 2007, 9:47:36 PM12/14/07
to django...@googlegroups.com
> no caso o q ocorre é q na tabelaA tenho FK de tabelaB e na tabelaB o
> inverso.

Não tem como fazer isso no Django! Reveja a sua modelagem, mas acho
que tem uma maneira de fazer sua modelagem sem esse relacionamento
cruzado.

Se puder compartilhar conosco o escopo da sua modelagem, podemos lhe
ajudar a crirar seus model's.

[]'s
--
Andrews Medina
http://pyman.blogspot.com/
www.andrewsmedina.com.br

Manoela Chagas

unread,
Dec 14, 2007, 10:25:35 PM12/14/07
to django...@googlegroups.com
No caso tenho tabela pessoa e representante

uma pessoa pode muitos representantes

e representantes pode ter muitas pessoas

pensei na MAnyToMany mas não seria isto

já quando cadastrar a pessoa tenho q dizer qual representante ela pertence, pois cada representante tem seus proprios clientes e nao podem ver as informações um do outro.

mas na tabela representante pessoa tm q ser fk

dai todo este problema rsrsrs


2007/12/15, Andrews Medina <andrew...@gmail.com >:

Andrews Medina

unread,
Dec 14, 2007, 11:13:47 PM12/14/07
to django...@googlegroups.com
Olá Manoela,

On Dec 15, 2007 12:25 AM, Manoela Chagas <manoel...@gmail.com> wrote:
> No caso tenho tabela pessoa e representante
>
> uma pessoa pode muitos representantes
>
> e representantes pode ter muitas pessoas
>
> pensei na MAnyToMany mas não seria isto

No caso você tem pessoas ( clientes ) e representantes, onde um
cliente pode ter vários representantes e um representante pode ter (
representar ) vários clientes é isso?

Nesse caso seria o ManyToManyField sim.

Eu faria algo assim

[code]
class Cliente(models.Model):
nome = models.CharField(max_length=200)
....

class Representantes(models.Model):
nome = models.CharField(max_length=200)
clientes = models.ManyToManyField(Cliente)
...

[/code]

Dessa forma um representante podem ter varios clientes. E mais de um
representante pode representar o mesmo cliente ( assim um cliente pode
ter mais de um representante ).

Se tiver problemas em como inserir os representantes,, clientes, ou
duvidas no desenvolvimento do formulário e interface, ou se eu estiver
viajando na maionese ( é de madrugada ). É só postar. Mas acho que um
modelo assim resolve seu problema.

Maurício Araújo

unread,
Dec 15, 2007, 4:49:15 AM12/15/07
to django...@googlegroups.com
Olá pessoal!

Estou interessado em Python e fiquei sabendo do Django. Não esperei e entrei
para esta lista de debates.

Inicialmente tenho duas dúvidas:

1. Para desenvolver aplicações terei que fazê-lo no Linux e no Windows não
seria possível, certo?

2. Caso desenvolva em uma máquina com Linux, poderia hospedar a aplicação em
um servidor (intranet) Windows com o Apache?

Desde já agradeço a ajuda.

[],
Maurício

Jader Rubini

unread,
Dec 15, 2007, 7:12:14 AM12/15/07
to django...@googlegroups.com
Olá, Maurício. Welcome to the Django :)

Vamos às respostas:

> 1. Para desenvolver aplicações terei que fazê-lo no Linux e no Windows não
> seria possível, certo?

Errado. Django é baseado em Python e, portanto, é multiplataforma. ;)


> 2. Caso desenvolva em uma máquina com Linux, poderia hospedar a aplicação
> em um servidor (intranet) Windows com o Apache?

Perfeitamente. Atualmente eu utilizo Ubuntu na maioria do tempo, mas no início eu comecei no Windows com Apache.
Apesar de que, *durante o desenvolvimento*, não é necessário um servidor como o Apache. O Django tem no gatilho um servidor perfeito pra ser utilizado durante o desenvolvimento (e, acredite, você vai querer usá-lo ao invés do Apache).

Caso você precise de um tutorial explicativo de como instalar/configurar todo o ambiente necessário para dsenvolver com Django no Windows, eu indico esse (em inglês): http://thinkhole.org/wp/django-on-windows/

Não se esqueça também de passar pelo site da nossa comunidade: http://djangbrasil.org


Abraços e bons estudos. ;)


--------------------------------
Jader Rubini
jader...@gmail.com
http://jaderubini.wordpress.com


> -----Mensagem original-----
> De: django...@googlegroups.com [mailto:django...@googlegroups.com]
> Em nome de Maurício Araújo
> Enviada em: sábado, 15 de dezembro de 2007 07:49
> Para: django...@googlegroups.com
> Assunto: [django-brasil] Iniciante...

Marinho Brandao

unread,
Dec 15, 2007, 7:37:01 AM12/15/07
to django...@googlegroups.com
Olá Maurício, bom dia!

Em 15/12/07, Maurício Araújo<ark...@globo.com> escreveu:


>
> Olá pessoal!
>
> Estou interessado em Python e fiquei sabendo do Django. Não esperei e entrei
> para esta lista de debates.
>
> Inicialmente tenho duas dúvidas:
>
> 1. Para desenvolver aplicações terei que fazê-lo no Linux e no Windows não
> seria possível, certo?

Errado (que bom! rs). Tanto o Python quanto o Django são
multiplataforma e funcionam muito bem em Linux, Unix, Windows, Mac e
outro bocado de sistemas operacionais :)

> 2. Caso desenvolva em uma máquina com Linux, poderia hospedar a aplicação em
> um servidor (intranet) Windows com o Apache?

sim, sem problema nenhum, tenho casos assim e existem vários outros
pela rede. Você pode fazer também o contrário, se quiser.

aqui na lista existe uma tendência natural pelo Linux, então
provavelmente você vai ter um *leve* incentivo a usar Linux em tudo,
mas é uma escolha sua.

> Desde já agradeço a ajuda.

você pode iniciar por esses endereços: [1], [2], [3] e [4]

existem vários blogs e sites pelo Google, basta dar uma navegada que
vai encontrar muita coisa boa. Você pode encontrar vários outros nos
"planetas" da comunidade, e ao fim da lista os meus dois.

[1] http://www.pythonbrasil.com.br/
[2] http://www.djangobrasil.org/
[3] http://www.djangoproject.com/
[4] http://www.djangobook.com/
[5] http://www.djangobrasil.org/comunidade/
[6] http://www.djangoproject.com/community/
[7] http://www.pythonbrasil.com.br/planet/
[8] http://marinho.webdoisonline.com/
[9] http://del.icio.us/marinho/django

no mais, estamos aí :)

>
> [],
> Maurício
>
>
> >
>


--
Marinho Brandão (José Mário)
http://marinho.webdoisonline.com/

Manoela Chagas

unread,
Dec 15, 2007, 8:20:33 AM12/15/07
to django...@googlegroups.com
pessoas (pode ser um cliente, um representante, ou meramente um contato)

um cliente pode ter mais de um representante, no caso
um representante de brita, outro de areia, só q
assim cada representante tem seus próprios clientes
nao pode ver os clientes dos outros representantes
podendo o cliente ser do representante de areia com
tal id e no representante de brita com tal id
o representante nao vai ver os clientes dos outros
se porventura a pessoa for cliente do outro
representante ele cadastra o cliente como se nao tivesse
cada representante com seus clientes
a opção ManyToMany não funcionária neste caso

Em 15/12/07, Andrews Medina <andrew...@gmail.com> escreveu:

David Kwast

unread,
Dec 15, 2007, 6:47:35 PM12/15/07
to django...@googlegroups.com

No campo de FK é possível referenciar o Modelo a ser relacionado com uma String
Acredito que no link abaixo dê para entender o que eu quero mostrar. Se é o que eu entendi o problema. As vezes lendo um pouco mais a DOC é possível saber o que deve ser feito no seu caso.

http://www.djangoproject.com/documentation/models/mutually_referential/
http://www.djangoproject.com/documentation/models/m2o_recursive/
http://www.djangoproject.com/documentation/model-api/#relationships

Na duvida fiz esse teste e funfou:

from django.db import models

# Create your models here.

class A(models.Model):
 outro = models.ManyToManyField('B',blank=True)
 class Admin:
     pass

class B(models.Model):
 outra = models.ManyToManyField('A',blank=True)
 class Admin:
     pass


[]s

Andrews Medina

unread,
Dec 17, 2007, 12:32:14 PM12/17/07
to django...@googlegroups.com
Olá Manoela,

desculpe pela demora da resposta...

> um cliente pode ter mais de um representante, no caso
> um representante de brita, outro de areia, só q
> assim cada representante tem seus próprios clientes
> nao pode ver os clientes dos outros representantes
> podendo o cliente ser do representante de areia com
> tal id e no representante de brita com tal id
> o representante nao vai ver os clientes dos outros
> se porventura a pessoa for cliente do outro
> representante ele cadastra o cliente como se nao tivesse
> cada representante com seus clientes
> a opção ManyToMany não funcionária neste caso

O relacionamento ManyToMany, traduzindo do inglês, muitos para muitos,
no seu caso representaria que muitos clientes podem ter muitos
representantes ou vice-versa.

Mesmo se configurando manytomany em apenas um dos dois models
envolvidos, pode-se manipular esse relacionamento dos dois lados.

Vamos ao código:

Criei duas classes para ilustrar meu exemplo:

[code]
class Cliente(models.Model):
nome = models.CharField(max_length=100)

def __unicode__(self):
return self.nome

class Representante(models.Model):
nome = models.CharField(max_length=100)
clientes = models.ManyToManyField(Cliente)

def __unicode__(self):
return self.nome
[/code]

Eu coloquei o manytomany no representante, mas poderia ter feito o
contrário, se eu tivesse feito primeiro a classe dos representantes.

Vamos popular a nossa base de dados com algums clientes e
representantes ( qualquer semelhança é mera coincidencia ).

[code]
>>> c1 = Cliente(nome='andrews')
>>> c1.save()

>>> c2 = Cliente(nome='waa')
>>> c2.save()

>>> r1 = Representante(nome='semente ltda')
>>> r1.save()
>>> r2 = Representante(nome='marinho inc')
>>> r2.save()

[/code]

Vamos ver os clientes do representante r1 (semente ltda)
[code]
>>> r1.clientes.all()
[]
[/code]

Bom o representante r1 (semente ltda) não tem nenhum cliente (coitadinho!!!)

Agora temos dois clientes e dois representantes, vamos adicionar o
cliente c1 (andrews) ao representante r2 (marinho inc).

[code]
>>> r2.clientes.add(c1)
>>> r2.clientes.all()
[<Cliente: andrews>]
[/code]

E se quisermos fazer o contrario, definirmos o representante a partir
do clientes. É possivel?

A resposta é: Sim.

Vamos colocar o representante r2 (marinho inc) como representante para
o cliente c2 (waa).

[code]
>>> c2.representante_set.add(r2)
>>> c2.representante_set.all()
[<Representante: marinho inc>]
[/code]

Ou seja instancia.model_set.acao().


Conclusão: o seu caso pode ser resolvido com o ManyToMany.

Acho que está havendo um engano da sua parte. O que você quer é que
apareça no admin para os representantes apenas os clientes que ele tem
e que seja ocultado os outros clientes. Se for isso, o problema não
tem nada haver com o ManyToMany e sim com os componentes de exibição
do admin.

Andrews Medina

unread,
Dec 17, 2007, 12:40:11 PM12/17/07
to django...@googlegroups.com
> from django.db import models
>
> # Create your models here.
>
> class A(models.Model):
> outro = models.ManyToManyField('B',blank=True)
> class Admin:
> pass
>
> class B(models.Model):
> outra = models.ManyToManyField('A',blank=True)
> class Admin:
> pass
>
David,

como eu expliquei num email anterior o relacionamento manytomany é
duas pontas, definindo que A é ManytoMany de B não é necessário um
ManyToMany em A falando que B é ManyToMany de A.

Para entender melhor veja a estrutura repetida de tabelas que o Django
ira fazer se voce fizer isso.

David Kwast

unread,
Dec 17, 2007, 2:05:58 PM12/17/07
to django...@googlegroups.com
Tudo bem, viajei mesmo. O ManyToMany já faz isso muito bem.

[]s
Reply all
Reply to author
Forward
0 new messages