Ir para o conteúdo
Helio13

Django + Tastypie + MongoDB

Mensagens Recomendadas

Helio13

Boas pessoal!

Estou a tentar implementar uma API na minha aplicação em django para intergir com o mongodb e a seguir com o AngularJS.

Mas neste momento estou a tentar por o Tastypie a funcionar com o MongoDB..

Já alguém alguma vez implementou algo parecido que me possa ajudar??

Obrigado

Cumprimentos

Hélio

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

Oi

Tenho uma aplicação feita em Django e MongoDB, estou a utilizar o mongoengine e tenho o tastypie para fazer a api...

Está tudo a funcionar correctamente, mas apenas com uma colecção no mongo...

Mas agora preciso de ter mais que uma, mas de alguma forma elas têm que estar "relacionadas"...sei que posso ter eles embutidos ou ter eles referenciados...mas não estou a conseguir perceber como vou fazer...

Vou dar um exemplo: Tenho o filme e esse filme pode estar em vários discos...

Em que o filme será uma colecção e o disco outra...

O código que estou a tentar fazer é este:

http://plnkr.co/edit/jLiyC64vfLECshjFQD3m

Mas não está a funcionar :/

Alguém me consegue ajudar?? A perceber o que estou a fazer mal?

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Pedro C.

Podes meter aqui o teu código e a transcrição do erro que te está a dar?

Se o problema não for um erro mas sim o resultado do código não ser o esperado diz qual é a tua expectativa e o que esta a acontecer em vez disso.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

O meu código está aqui neste link:

http://plnkr.co/edit/jLiyC64vfLECshjFQD3m

O que eu quero é meter um colecção dentro da outra...e é o que não estou a conseguir...

Tipo, tenho um filme que pode estar em vários disco, e queria por o filme dentro do disco...

Com o código que tenho, a api do disco...devolve o json normal e com um atributo filme a null, a api do filme dá erro, diz isto:

"error_message": "'NoneType' object has no attribute '_document'",

Alguém me pode ajudar?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Pedro C.

Olá. Estive a ver o teu código. Nunca trabalhei com o django ou mongodb. O interpretador deve dizer qual é a linha, no teu código, onde o erro está a acontecer (podes indicar-nos). É que nos scripts que estavam nesse link não estava nenhuma instrução para de facto correr alguma coisa (acho eu...), só encontrei definições de classes e funções. E também não consegui encontrar nenhuma variável "_document" em nenhuma das tuas classes.

De qualquer maneira esse é um erro comum quando uma classe faz um "return None" e ao tentar chamar-se uma das suas variáveis, dado que a classe não chegou a ser inicializada, dá problemas.

A maneira dessa biblioteca definir os seus scripts é nova para mim (classes dentro de classes "meta", sem self aparente, e sem inicializador __init__). Ainda assim penso que estás ou a chamar uma classe que não existe (porque não é uma classe) ou os argumentos que dás para ela são incompativeis pelo que devolve nada.

Na linha que te dá o erro deve estar identificada a classe que dá problemas. Podes ir buscar a definição da classe e pô-la aqui?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

Boas!

Neste momento o que estou a tentar fazer, é tendo uma colecção filme e outra disco, é fazer o seguinte:

Introduzo os dados do filme, e depois quando vou introduzir os dados do disco, quero fazer referencia que naquele disco existe o filme x...

Para tal estou a fazer o seguinte código:

http://plnkr.co/edit/jLiyC64vfLECshjFQD3m

Quando estou a introduzir os dados do disco, quando faço post envio junto o id do filme que quero fazer a referencia...

Mas quando faço o enviar, ele dá me um erro, e não estou a perceber o que é...o erro é o seguinte:

error_message

"The URL provided '514892b08774a711ecc7db76' was not a link to a valid resource."

Depois também me aparece um traceback bastante grande, que eu coloquei no link acima, no ficheiro erro...

Se me puderes ajudar agradecia...pois não estou mesmo a perceber o porque do erro...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Pedro C.

Sim o erro dá no resources e no fields que assumo que sejam modulos da biblioteca que estás a usar pelo que provavelmente estás a lidar com um erro na mesma, nomeadamente na leitura de dados. Dado que o traceback não mostra nenhum dos teus ficheiros (nomeadamente no api.py) provavelmente isto estará a acontecer quando ele tenta "compilar" o módulo no acto de importação.

O traceback parece-me uma trapalhada visto que chama ficheiros com o mesmo nome em pastas diferentes. Agora o teu código está a chamar informação de algum ficheiro (ascii possivelmente)? E se está esse ficheiro tem o formato reconhecido por estas classes?

É que o problema pode ser na argumentação para as classes da biblioteca. A referência que te deu no erro, '514892b08774a711ecc7db76' , existe onde?

A ideia é ele está a ler um ficheiro e esse ficheiro não tem um separador que ele reconheça como sendo válido e acaba por dar erro. Isto vem de ter visto este post: http://stackoverflow.com/questions/11276099/django-tastypie-manytomany-saving-error

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

Tipo eu estou a inserir os dados dos filmes e do disco através de uma aplicação em angularjs...através de POST

Até ai tudo bem, ele insere correctamente...

Mas agora quero que ao inserir dados de um disco, eu diga que esse disco tem o filme "x"...esse filme esta na colecção dos filmes e tem um id.

Então quando insiro os dados do filme, vou enviar o id do filme, para fazer referencia, que no disco, existe o filme com o id "x"

Esse '514892b08774a711ecc7db76' é o id de um filme

Mas não estou a conseguir, porque me está a dar esse erro e nao sei, o que está mal...percebes te?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Pedro C.

Bem segundo o post que linkei acima esse problema é comum quando o formato do ficheiro não é reconhecido, nomeadamente quando usas ponto e virgula como separador de campos.

Considerando que não sabes se o problema está na biblioteca ou no formato do ficheiro a melhor maneira de fazer debbuging é experimentando. Existe algum ficheiro que tenhas visto num tutorial ou assim que saibas que funciona com a versão que estás a usar dessa biblioteca?

Se conseguires fazer esse funcionar então o problema será do ficheiro (admitindo que é só um problema) caso contrário terás de virar a tua atenção para o código da biblioteca.

Já agora uma observação. Assumo que as pessoas que participam deste fórum não vão saber o que é o angularjs nem o POST (eu pelo menos não sei) caso contrário já teriam dito alguma coisa. Isso implica que não vão saber o que está a sair fora desses comandos. O que elas sabem é que para um determinado tipo de ficheiro vai ser necessário um determinado tipo de parsing de leitura desse mesmo ficheiro e isso podem elas podem analisar e opinar e até resolver o problema. A api dessas bibliotecas é-nos desconhecida mas o código em python que elas usam não.

Sabendo isto repara que só posso especular que no sitio onde deu este erro:

error_message

"The URL provided '514892b08774a711ecc7db76' was not a link to a valid resource."

Ele procurou esse id numa lista ou qualquer outro tipo de base de dados e devolveu-lhe falso. Se a primeira hipótese que falei (de o ficheiro de entrada não estar no formato certo) não ser a correcta então teria de ir ver o código que está a dar problemas, neste caso em particular na linha 636 do ficheiro "build\bdist.win32\egg\tastypie\resources.py", onde ele passou essa mensagem porque provavelmente falhou num teste booleano (if "qualquer coisa": ).

File "build\bdist.win32\egg\tastypie\resources.py", line 636, in get_via_uri

raise NotFound("The URL provided '%s' was not a link to a valid resource." % uri)

Sabendo o que falhou (pelo teste booleano) tenho de ir andando para trás até ver o que aconteceu. Se o problema estiver muito ao principio isto vai demorar porque o traceback é extenso. Pessoalmente sugiro que faças debug com prints. Por exemplo, se a partir do teste booleano eu souber que uma variável está mal começo a meter prints em todo o traceback para ela. Corro o programa e vejo o ponto em que variável deixou de ser a correcta para passar no teste, se é que alguma vez esteve. Lamento não poder ter uma resposta mais especifica para essa API mas eu desconheço-a. Não me importo de todo de ir analisando o debugging que fores fazendo se o meteres aqui até se arranjar uma resposta para o teu problema. Eu sei que o processo é moroso mas é o único que me parece infalivel de momento.

Editado por Pedro C.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

Tive a fazer uns testes no meu código, e já descobri o que está mal...mas ainda não fiz...

A questão está na aplicação angularjs ao enviar o id.

Pois, caso no meu código django, eu comente as linhas de referencias, e deixe só um campo para inserir o id...então eu insiro o id, e depois vá ao django e faça a referencia, ele funciona correctamente...quando vou á minha api lá esta os dados correspondentes aquele id que inseri.

Logo o problema está ao enviar o id do angularjs, pois ele deve estar a dar erro porque deve estar à espera de um objecto e eu só lhe estou a enviar um id...

Por isso, acho que tenho que enviar o objecto completo corresponde ao id que quero...

Fiz me entender?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

Sim, estou a passar o id directamente por argumento numa função...

Estou a fazer assim:

$scope.insere = function(){

$scope.dados = $scope.disco.save({Tipo:this.Tipo, Legendas:this.Legendas, OndeComprado:this.OndeComprado,

Observacoes:this.Observacoes, filmeid: this.filme})

Como envio os outros dados

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Pedro C.

Bem nesse caso parabens. A tua hipótese (passar um objecto em vez de uma string "id", penso eu) deverá ser fácil de verificar dado que as chamadas são diferentes. Se for um objecto (classe assumo eu) os seus atributos são chamados posteriormente aos pontos ao invés de um string ou um número que são usados directamente.

Mas a função deve ter documentação (e dai talvez não, segundo me lembro é uma versão 0.3). Experimenta lançar o comando print help(funcao).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Pedro C.

Segundo percebi o problema é que não sabes como é que o objecto id entra na função, se como uma variável simples, se como composta (tipo classe, objecto). Geralmente quando se programa em python é comum fazer-se documentação na própria função, nomeadamente na descrição dos argumentos e o que devem ser. Transcrevendo um exemplo que está na net:

def fibo_gen():
'''Generate Fibonacci numbers; return an iterator'''
x, y = 0, 1
while True:
	yield x
	x, y = y, x + y

Agora quem importar a função pode chamar o help do python para ver a documentação feita na função acima:

>>> help(fibo_gen)

Help on function fibo_gen in module __main__:

fibo_gen()
 Generate Fibonacci numbers; return an iterator.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

Não percebes te o meu problema...eu esta parte de enviar o id, não estou a fazer no django, o django que a funcionar com a tastypie como uma api...

Eu estou a enviar os dados de uma aplicação em AngularJS para o Django (tastypie api)

Percebes te?

O Django só está a fazer de Rest Server entre a aplicação em AngularJS e o MongoDB

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Pedro C.

Sim, não digo o contrário. Nem me lembrava de ter comentado o django. A única coisa que tinha constatado pelo traceback é que foi no MongoDB que o erro deu pelo que sugeri veres o help da função para perceberes que tipo de argumento tem de entrar no MongoDB (isto se alguém fez o help da função, que se faz como no exemplo que está no post anterior).

A partir do momento em que saibas isso podes até fazer o teu próprio parsing se tudo o resto falhar.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.