2011-05-24 2 views
0

Je l'ai utilisé réponse de cette question:Django: problème avec RawQuerySet passant params plusieurs

Django: making raw SQL query, passing multiple/repeated params?

mais ont quelques problèmes.

J'ai params:

params = {'film_id_string': 'core_film.parent_id', 'tags_params': 'comedy', 'order_by': 'core_film.title', 'content_type': '18', 'language_code': 'en'} 

pour requête SQL:

query = 'SELECT DISTINCT "core_object".*, "core_film".* FROM "core_film" INNER JOIN "core_object" ON ("core_film"."parent_id" = "core_object"."id") LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = %(film_id_string)s) LEFT OUTER JOIN "tagging_taggeditem" ON ("tagging_taggeditem"."object_id" = "core_objectlocalized"."id") LEFT OUTER JOIN "tagging_tag" ON ("tagging_tag"."id" = "tagging_taggeditem"."tag_id") WHERE "tagging_tag"."name" IN (%(tags_params)s) AND "core_objectlocalized"."LANG"=%(language_code)s AND content_type_id=%(content_type)s ORDER BY %(order_by)s' 

Quand j'ai essayé d'utiliser RawQuerySet

films = Film.objects.raw(query, params) 

Je reçois:

SELECT DISTINCT "core_object".*, "core_film".* 
FROM "core_film" 
INNER JOIN "core_object" ON ("core_film"."parent_id" = "core_object"."id") 
LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = E\'core_film.parent_id\') 
LEFT OUTER JOIN "tagging_taggeditem" ON ("tagging_taggeditem"."object_id" = "core_objectlocalized"."id") 
LEFT OUTER JOIN "tagging_tag" ON ("tagging_tag"."id" = "tagging_taggeditem"."tag_id") 
WHERE "tagging_tag"."name" IN (E\'comedy\') 
    AND "core_objectlocalized"."LANG"=E\'en\' 
    AND content_type_id=E\'18\' 
ORDER BY E\'core_film.title\' 

Le problème est que chaque lieu avec 'E\' générer une erreur semblable à ceci:

DatabaseError: invalid input syntax for integer: "core_film.parent_id" 
LINE 1: ...calized" ON ("core_objectlocalized"."parent_id" = E'core_fil... 

Comment puis-je résoudre ce problème?

Version Django 1.2.3.

modifier
Je ne peux pas supprimer les citations, parce que je travaille avec la chaîne:

result = self.function(result, tag, "core_film.parent_id") 
def function(self, objects, tags, film_id_string): 

Mes params pour RawQuerySet ressemblent à ceci:

params = {'film_id_string': film_id_string} 

Lorsque je tente d'analyser cette Je reçois:

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = E\'core_film.parent_id\') 

et j'ai des problèmes avec

DatabaseError: invalid input syntax for integer: "core_film.parent_id" 
LINE 1: ...calized" ON ("core_objectlocalized"."parent_id" = E'core_fil... 

mais, quand j'utilise le formatage de chaîne

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = %s)' % film_id_string 

cela fonctionne:

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = core_film.parent_id) 

Je veux ommettre posibility d'injection SQL, donc basant sur Django docs Je ne veux pas passer les paramètres avec le formatage de chaîne.
Que puis-je faire d'autre?

+2

Essayez de supprimer les apostrophes des valeurs dans le dictionnaire. C'est comme ça dans le vieux post plus ancien, et il semble que la base de données essaye de leur échapper ce qui est la cause du E \ ... \. – solartic

+0

@solartic, merci pour la suggestion.Partiellement j'ai enlevé des citations, mais le problème existe toujours. J'ai également ajouté des informations supplémentaires à ma question. –

+0

@dasm Honnêtement, cette information supplémentaire me déroute, mais de toute façon l'erreur me dit qu'une valeur entière est attendue pour "core_objectlocalized". "Parent_id", et vous passez une chaîne? Dans votre dernier bloc de code, vous l'utilisez comme une variable et non comme une piqûre qui fonctionne pour vous. – solartic

Répondre

1

Django empêche interjection SQL en échappant à des paramètres. Ceci est une déclaration SQL, donc le fait que cela ne fonctionne pas est une bonne chose - Django fait son travail. À moins que les utilisateurs du système seront réglage de la valeur pour « film_id_string » ce que vous avez fait pour obtenir au travail devrait être ok. Sinon, vous devrez alors encore utilisé la méthode » ...% s)% film_id_string ... » mais créer votre propre filtre personnalisé pour valider qu'il est l'une des valeurs autorisées correctes.