Django-fr

Forum

#1 07-09-2011 19:58:29

MikouRoux
Membre
Inscription : 07-09-2011
Messages : 4

filter sur un ForeignKey

Bonsoir,

J'ai remarqué que mon filter en ligne de commande ne fonctionne pas


>>> from app.models import Device
>>> list = Device.objects.filter(author__icontains='user')
>>> print list

Voici le modèle :

from django.db import models
from datetime import datetime
from django.contrib.auth.models import User

class Device(models.Model):
    # main fields
    name=models.CharField(max_length=64, help_text="maximum 64 characters")
    description=models.TextField()
    url = models.URLField(verify_exists=True, max_length=200)

    # meta
    author = models.ForeignKey(User)
    pub_date = models.DateTimeField(default=datetime.now())
    
    def __unicode__(self):
        return self.name

Voici le log:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/manager.py", line 141, in filter
    return self.get_query_set().filter(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/query.py", line 550, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/query.py", line 568, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/sql/query.py", line 1172, in add_q
    can_reuse=used_aliases, force_having=force_having)
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/sql/query.py", line 1107, in add_filter
    connector)
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/sql/where.py", line 67, in add
    value = obj.prepare(lookup_type, value)
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/sql/where.py", line 316, in prepare
    return self.field.get_prep_lookup(lookup_type, value)
  File "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/fields/related.py", line 141, in get_prep_lookup
    raise TypeError("Related Field has invalid lookup: %s

Merci d'avance si pouvez m'aider.

Hors ligne

#2 07-09-2011 21:10:56

Richard
Membre
Lieu : Paris
Inscription : 11-08-2010
Messages : 22
Site Web

Re : filter sur un ForeignKey

Bonsoir

ca depend de ce que tu veux filter
si c'est l'existence d'un user 'au bout' de la FK:
list = Device.objects.filter(author__isnull=False')

si c'est sur un champ de l'objet user:
list = Device.objects.filter(author__lastname__icontains='user')

le double underscore te permet de suivre la relation

RM

Richard Moch
http://www.rootsaka.com




On Wed, Sep 7, 2011 at 20:58, Michael <michael.jespersen _AT_ gmail.com> wrote:
> Bonsoir,
>
> J'ai remarqué que mon filter en ligne de commande ne fonctionne pas
>
>
>

>>>> from app.models import Device
>>>> list = Device.objects.filter(author__icontains='user')
>>>> print list
>

>
> Voici le modèle :
>

> from django.db import models
> from datetime import datetime
> from django.contrib.auth.models import User
>
> class Device(models.Model):
>    # main fields
>    name=models.CharField(max_length=64, help_text="maximum 64
> characters")
>    description=models.TextField()
>    url = models.URLField(verify_exists=True, max_length=200)
>
>    # meta
>    author = models.ForeignKey(User)
>    pub_date = models.DateTimeField(default=datetime.now())
>
>    def __unicode__(self):
>        return self.name
>

>
> Voici le log:
>

> Traceback (most recent call last):
>  File "<console>", line 1, in <module>
>  File
> "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/manager.py",
> line 141, in filter
>    return self.get_query_set().filter(*args, **kwargs)
>  File
> "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/query.py",
> line 550, in filter
>    return self._filter_or_exclude(False, *args, **kwargs)
>  File
> "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/query.py",
> line 568, in _filter_or_exclude
>    clone.query.add_q(Q(*args, **kwargs))
>  File
> "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/sql/query.py",
> line 1172, in add_q
>    can_reuse=used_aliases, force_having=force_having)
>  File
> "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/sql/query.py",
> line 1107, in add_filter
>    connector)
>  File
> "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/sql/where.py",
> line 67, in add
>    value = obj.prepare(lookup_type, value)
>  File
> "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/sql/where.py",
> line 316, in prepare
>    return self.field.get_prep_lookup(lookup_type, value)
>  File
> "/Library/Python/2.7/site-packages/Django-1.3-py2.7.egg/django/db/models/fields/related.py",
> line 141, in get_prep_lookup
>    raise TypeError("Related Field has invalid lookup: %s
>

>
> Merci d'avance si pouvez m'aider.
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 08-09-2011 12:04:06

MikouRoux
Membre
Inscription : 07-09-2011
Messages : 4

Re : filter sur un ForeignKey

Merci Richard de ta réponse.

Je cherche à retrouver tous les éléments qui appartiennent à un certain utilisateur. C'est pour faire une view qui regroupe les objets par nom d'utilisateurs. avec une URL du type :

(r'^lists/(?P<username>\w+)/$', 'app.views.user_list')

Donc, c'est plutôt un filtre qui va ressembler un peu à ça :

Device.objects.filter(author__lastname__icontains='user')

Ceci dit, je ne vois pas à quoi correspond "lastname" dans ce filtre.
Dans mon modèle, je n'ai que le champs "author" qui est un ForeignKey sur les User

J'ai trouvé un petit article (de 2006) qui décris comment faire ce que je cherche. Mais c'est pareil, je ne vois pas à quoi correspond owner et username dans le filtre.

todo_lists = TodoList.objects.filter(owner__username__exact=username)

http://www.b-list.org/weblog/2006/nov/1 … ric-views/

Hors ligne

#4 08-09-2011 12:25:59

Richard
Membre
Lieu : Paris
Inscription : 11-08-2010
Messages : 22
Site Web

Re : filter sur un ForeignKey

owner ou lastname sont des noms de champs arbitraires, à titre
d'exemple. Contrairement à icontains qui est une fonction de
comparaison

donc User est un objet django, dont last_name est la propriété qui
contient le nom de famille du user
dans mon exemple je supposai que tu cherche sur le nom de famille du
utilisateur.

A ce stade je t'invite à lire la doc des Queryset. Tu ne peux pas y
échapper pour avancer ;-)
https://docs.djangoproject.com/en/1.3/topics/db/queries/

RM

Richard Moch
http://www.rootsaka.com




2011/9/8 Michael <michael.jespersen _AT_ gmail.com>:
> Merci Richard de ta réponse.
>
> Je cherche à retrouver tous les éléments qui appartiennent à un
> certain utilisateur. C'est pour faire une view qui regroupe les objets par
> nom d'utilisateurs. avec une URL du type :
>

(r'^lists/(?P<username>\w+)/$', 'app.views.user_list')

>
> Donc, c'est plutôt un filtre qui va ressembler un peu à ça :
>

Device.objects.filter(author__lastname__icontains='user')

>
> Ceci dit, je ne vois pas à quoi correspond "lastname" dans ce filtre.
> Dans mon modèle, je n'ai que le champs "author" qui est un ForeignKey sur
> les User
>
> J'ai trouvé un petit article (de 2006) qui décris comment faire ce que
> je cherche. Mais c'est pareil, je ne vois pas à quoi correspond owner et
> username dans le filtre.
>

todo_lists =
> TodoList.objects.filter(owner__username__exact=username)

>
> http://www.b-list.org/weblog/2006/nov/16/django-tips-get-most-out-generic-views/
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#5 08-09-2011 14:34:28

MikouRoux
Membre
Inscription : 07-09-2011
Messages : 4

Re : filter sur un ForeignKey

ok. Je comprends mieux maintenant.
Effectivement, author, c'est mon champs rataché à la table user. Donc si je veux chercher par rapport au nom d'utilisateur, c'est
author__username...

Merci de ton aide.

Hors ligne

Pied de page des forums