Estou definindo meus modelos de Django agora e percebi que não havia nenhum OneToManyField
tipo de campo no modelo. Tenho certeza de que há uma maneira de fazer isso, então não tenho certeza do que estou perdendo. Eu basicamente tenho algo parecido com isto:
class Dude(models.Model):
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
Nesse caso, cada um Dude
pode ter vários PhoneNumber
s, mas o relacionamento deve ser unidirecional, pois não preciso saber de PhoneNumber
quem Dude
é o proprietário, por si só, pois posso ter muitos objetos diferentes que possuem PhoneNumber
instâncias, como um Business
para exemplo:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
O que eu substituiria OneToManyField
(que não existe) no modelo para representar esse tipo de relacionamento? Eu sou do Hibernate / JPA, onde declarar um relacionamento um para muitos foi tão fácil quanto:
@OneToMany
private List<PhoneNumber> phoneNumbers;
Como posso expressar isso no Django?
fonte
dude = models.ForeignKey(Dude, related_name='numbers')
e poderá usarsome_dude_object.numbers.all()
todos os números relacionados (se você não especificar um "related_name", o padrão será "number_set").No Django, um relacionamento um para muitos é chamado ForeignKey. Porém, ele funciona apenas em uma direção; portanto, em vez de ter um
number
atributo de classe,Dude
você precisaráMuitos modelos podem ter um
ForeignKey
para outro, portanto, seria válido ter um segundo atributo dePhoneNumber
tal forma queVocê pode acessar os
PhoneNumber
s para umDude
objetod
comd.phonenumber_set.objects.all()
e, em seguida, fazer o mesmo para umBusiness
objeto.fonte
ForeignKey
significava "um para um". Usando o exemplo acima, eu deveria ter umDude
que tem muitos,PhoneNumbers
certo?ForeignKey
é apenas um para um se você especificarForeignKey(Dude, unique=True)
, portanto, com o código acima, você obterá umDude
com váriosPhoneNumber
s.PhoneNumber
. Agora está começando a fazer sentido.ForeignKey
é, essencialmente, muitos-para-um, então você precisa fazer isso para trás para obter um one-to-many :)phonenumber_set
? Não o vejo definido em lugar algum. É o nome do modelo, em minúsculas, anexado com "_set"?Para ser mais claro - não há OneToMany no Django, apenas ManyToOne - que é a Foreignkey descrita acima. Você pode descrever a relação OneToMany usando Foreignkey, mas isso é muito inexpressivo.
Um bom artigo sobre isso: https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/
fonte
Você pode usar uma chave estrangeira em muitos lados da
OneToMany
relação (ou seja,ManyToOne
relação) ou usarManyToMany
(em qualquer lado) com restrição exclusiva.fonte
django
é inteligente o suficiente. Na verdade, não precisamos definironeToMany
campo. Será gerado automaticamente pordjango
para você :-). Só precisamos definirforeignKey
na tabela relacionada. Em outras palavras, precisamos apenas definir aManyToOne
relação usandoforeignKey
.se queremos obter a lista de rodas de um carro em particular. usaremos o
python's
objeto gerado automaticamentewheel_set
. Para carroc
você usarác.wheel_set.all()
fonte
Embora a resposta da rolling stone seja boa, direta e funcional, acho que há duas coisas que ela não resolve.
Introduzir a estrutura de tipos de conteúdo , que expõe alguns objetos que nos permitem criar uma "chave estrangeira genérica" no modelo PhoneNumber. Então, podemos definir o relacionamento inverso em Cara e Negócios
Consulte os documentos para obter detalhes e, talvez, confira este artigo para obter um tutorial rápido.
Além disso, aqui está um artigo que argumenta contra o uso de FKs genéricos.
fonte
Se o modelo "many" não justificar a criação de um modelo em si (não é o caso aqui, mas pode beneficiar outras pessoas), outra alternativa seria confiar em tipos de dados específicos do PostgreSQL, através do pacote Django Contrib
Postgres pode lidar com matriz ou JSON tipos de dados, e isso pode ser uma boa solução para lidar com um-para-muitos, quando os muitos-s só pode ser vinculado a uma única entidade do um .
O Postgres permite acessar elementos únicos da matriz, o que significa que as consultas podem ser muito rápidas e evitar sobrecargas no nível do aplicativo. E, claro, o Django implementa uma API legal para alavancar esse recurso.
Obviamente, tem a desvantagem de não ser portátil para outros back-end de banco de dados, mas acho que ainda vale a pena mencionar.
Espero que ajude algumas pessoas a procurar idéias.
fonte
Antes de tudo, fazemos um tour:
01) relação um-para-muitos:
Nota: O Django não fornece nenhum relacionamento OneToMany. Portanto, não podemos usar o método superior no Django. Mas precisamos converter em modelo relacional. Então o que nós podemos fazer? Nesta situação, precisamos converter o modelo relacional em modelo relacional reverso.
Aqui:
modelo relacional = OneToMany
Então, modelo relacional reverso = ManyToOne
Nota: O Django suporta o relacionamento ManyToOne e no Django ManyToOne é representado pelo ForeignKey.
02) relacionamento muitos-para-um:
NB: PENSE SIMPLESMENTE !!
fonte