Atualmente, tenho muitos objetos python no meu código semelhantes aos seguintes:
class MyClass():
def __init__(self, name, friends):
self.myName = name
self.myFriends = [str(x) for x in friends]
Agora eu quero transformar isso em um modelo do Django, onde self.myName é um campo de string e self.myFriends é uma lista de strings.
from django.db import models
class myDjangoModelClass():
myName = models.CharField(max_length=64)
myFriends = ??? # what goes here?
Como a lista é uma estrutura de dados tão comum em python, eu meio que esperava que houvesse um campo de modelo do Django para ela. Eu sei que posso usar um relacionamento ManyToMany ou OneToMany, mas esperava evitar esse indireção extra no código.
Editar:
Eu adicionei esta pergunta relacionada , que as pessoas podem achar útil.
python
django
django-models
entristecer
fonte
fonte
Respostas:
Esse relacionamento não seria melhor expresso como um relacionamento de chave estrangeira um para muitos em uma
Friends
tabela? Entendo quemyFriends
são apenas strings, mas eu pensaria que um design melhor seria criar umFriend
modelo eMyClass
conter uma relação de chave estrangeira na tabela resultante.fonte
"Otimização prematura é a raiz de todo o mal."
Com isso em mente, vamos fazer isso! Depois que seus aplicativos atingem um determinado ponto, a desnormalização de dados é muito comum. Feito corretamente, ele pode salvar inúmeras pesquisas caras no banco de dados, ao custo de um pouco mais de limpeza.
Para retornar um nome
list
de amigo, precisamos criar uma classe Django Field personalizada que retornará uma lista quando acessada.David Cramer postou um guia para criar um SeperatedValueField em seu blog. Aqui está o código:
A lógica desse código lida com os valores de serialização e desserialização do banco de dados para Python e vice-versa. Agora você pode facilmente importar e usar nosso campo personalizado na classe de modelo:
fonte
my_vals = SeparatedValuesField(blank=True, default="")
mas obtendo o IntegrityError por causa de NULLs. O argumento padrão não está sendo transmitido corretamente?to_python
não é mais necessário ler. Assim, para fazer este trabalho você precisa adicionar:def from_db_value(self, value, expression, connection, context): return self.to_python(value)
Uma maneira simples de armazenar uma lista no Django é apenas convertê-la em uma string JSON e salvá-la como Texto no modelo. Em seguida, você pode recuperar a lista convertendo a sequência (JSON) novamente em uma lista python. Aqui está como:
A "lista" seria armazenada no seu modelo do Django da seguinte forma:
Na sua visão / código do controlador:
Armazenando a lista no banco de dados:
Recuperando a lista do banco de dados:
Conceitualmente, aqui está o que está acontecendo:
fonte
Se você estiver usando Django> = 1.9 com o Postgres, poderá usar as vantagens do ArrayField
Também é possível aninhar campos de matriz:
Como o @ thane-brimhall mencionou, também é possível consultar elementos diretamente. Referência da documentação
fonte
Como esta é uma pergunta antiga, e as técnicas do Django devem ter mudado significativamente desde então, esta resposta reflete a versão 1.4 do Django e é provavelmente aplicável à versão 1.5.
O Django por padrão usa bancos de dados relacionais; você deve usá-los. Mapeie amizades para relações de banco de dados (restrições de chave estrangeira) com o uso de ManyToManyField. Isso permite que você use o RelatedManagers para listas de amigos, que usam conjuntos de consultas inteligentes. Você pode usar todos os métodos disponíveis, como
filter
ouvalues_list
.Usando
ManyToManyField
relações e propriedades:Você pode acessar a lista de amigos de um usuário desta maneira:
Observe, no entanto, que essas relações são simétricas: se Joseph é amigo de Bob, então Bob é amigo de Joseph.
fonte
fonte
Lembre-se de que isso eventualmente acaba em um banco de dados relacional. Portanto, usar relações é realmente a maneira mais comum de resolver esse problema. Se você absolutamente insistir em armazenar uma lista no próprio objeto, poderá fazê-lo, por exemplo, separado por vírgula, armazená-lo em uma sequência e fornecer funções de acessador que dividem a sequência em uma lista. Com isso, você ficará limitado a um número máximo de strings e perderá consultas eficientes.
fonte
Caso esteja usando o postgres, você pode usar algo como isto:
se você precisar de mais detalhes, pode ler no link abaixo: https://docs.djangoproject.com/pt-br/1.9/ref/contrib/postgres/fields/
fonte
Você pode armazenar praticamente qualquer objeto usando um campo Django Pickle, exceto este trecho:
http://www.djangosnippets.org/snippets/513/
fonte
Armazenando uma lista de strings no modelo Django:
e você pode chamar assim:
fonte
Minha solução, pode ser que ajude alguém:
fonte
O uso da relação um para muitos (FK de Friend para a classe pai) tornará seu aplicativo mais escalável (como você pode estender trivialmente o objeto Friend com atributos adicionais além do nome simples). E assim, este é o melhor caminho
fonte