2010-03-25 5 views
0

je suit dans mon modèle:erreur Django de débogage

class info(models.Model): 
    add = models.CharField(max_length=255) 
    name = models.CharField(max_length=255) 

Une des vues quand je dis info_l = info.objects.filter (id = 1) logging.debug (info_l.name)

Je reçois une erreur indiquant que le nom n'existe pas dans l'instruction de débogage. L'objet 'QuerySet' n'a pas d'attribut 'name' 1.Comment cela peut-il être résolu? 2.Egalement comment faire une requête pour un seul champ au lieu de tout sélectionner comme nom de l'information.

Répondre

2

1. Sélection d'éléments simples

On dirait que vous essayez d'obtenir un seul objet. L'utilisation de filter renverra un objet QuerySet (comme c'est le cas dans votre code), qui se comporte plus comme une liste (et, comme vous l'avez remarqué, n'a pas l'attribut name).

Vous avez deux options ici. Tout d'abord, vous pouvez simplement saisir le premier élément:

info_l = info.objects.filter(id=1)[0] 

Vous pouvez également utiliser la méthode objects.get à la place, qui retournera un seul objet (et lever une exception si elle n'existe pas):

info_l = info.objects.get(id=1) 

Django a une très bonne documentation sur QuerySets, et il peut être utile de jeter un coup d'oeil:
Docs on using filters
QuerySet reference

2. Les champs spécifiques Récupération

Django fournit les méthodes et deferonly, qui vous permettra de choisir des domaines spécifiques de la base de données, plutôt que de chercher de tout à la fois. Ceux-ci n'empêchent pas réellement les champs d'être lus; plutôt, il les charge paresseusement. defer est un mode «opt-in», qui vous permet de spécifier quels champs doivent être chargés paresseusement. only est "out-out" - vous l'appelez, et seulement les champs que vous passez seront chargés avec impatience.

Donc, dans votre exemple, vous voulez faire quelque chose comme ceci:

info_l = info.objects.filter(id=1).only('name')[0] 

Bien qu'avec un modèle aussi simple que l'exemple que vous donnez, je ne voudrais pas vous inquiéter beaucoup du tout sur la limitation des champs.

+0

Merci pour la réponse. Ce que je voulais dire est par exemple: sélectionnez le nom de info; au lieu de faire un select * à partir de info; Merci pour la réponse – Hulk

+0

Ah, je comprends maintenant. J'ai mis à jour la réponse. – ShZ

+0

+1 pour réfléchie, réponse complète pointant vers les docs. Nous avons besoin de plus de réponses comme celles-ci. :-) – cethegeek