2013-03-11 5 views
-1

Bon après-midi,Validation FK au sein de Django

J'ai mon serveur django en cours d'exécution avec une API REST en haut pour servir mes appareils mobiles. Maintenant, à un moment donné, l'appareil mobile communiquera avec Django.

Disons que le dispositif demande Django d'ajouter un objet dans la base de données, et dans cet objet, je dois définir un FK comme celui-ci:

objectA = ObjectA.objects.create(title=title, 
    category_id = c_id, order = order, equipment_id = e_id, 
    info_maintenance = info_m, info_security = info_s, 
    info_general = info_g, alphabetical_notation = alphabetical_notation, 
    allow_comments = allow_comments, 
    added_by_id = user_id, 
    last_modified_by_id = user_id) 

Si le e_id et C_Id est reçu depuis mon mobile périphériques, devrais-je vérifier avant d'appeler cette création s'ils existent toujours dans la base de données? Ce sont deux requêtes supplémentaires ... mais si elles peuvent éviter tout problème, cela ne me dérange pas!

Merci beaucoup!

+0

Comment ressemble la requête à l'API REST? –

Répondre

1

Il pense que Django crée une contrainte sur la clé étrangère par défaut (cela peut dépendre de la base de données). Cela signifie que si vos clés étrangères pointent vers quelque chose qui n'existe pas, alors l'enregistrement échouera (entraînant une exception sur le côté Python).

+0

Vous avez raison! J'ai juste besoin d'attraper l'erreur maintenant! Merci! – abisson

0

Vous pouvez le réduire à une seule requête (il devrait y avoir une seule requête au moins, avertissement Je n'ai pas testé le code):

if MyObject.objects.filter(id__in=[e_id, c_id]).distinct().count() == 2: 
    # create the object 
    ObjectA.objects.create(...) 
else: 
    # objects corresponding e_id and c_id do not exist, do NOT create ObjectA 

Vous devez toujours valider toute information qui est provenant d'un utilisateur ou pouvant être modifié par un utilisateur déterminé. Il ne serait pas difficile pour quelqu'un de renifler le trafic et commencer à construire leurs propres demandes REST à votre serveur. Toujours nettoyer et valider les données externes ajoutées au système.

+0

Je pense que 'c_id' et' e_id' pointent vers des objets dans différentes tables. Au moins, l'appellation suggère ("category_id" et "equipment_id" respectivement). Et les contraintes sur la base de données ont été conçues exactement pour cela. – freakish

+0

@freakish c'est le moins de leurs problèmes s'ils demandent réellement s'ils devraient ou non valider des informations provenant de sources extérieures via REST. –