2011-08-04 4 views
0

Je sais que c'est stupide, mais ...django clé étrangère requête complexe

J'ai deux classes de modèle

class Gallery(models.Model): 
    name = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published', auto_now_add=True) 

    def __unicode__(self): 
     return self.name 


class Image(models.Model): 
    gallery = models.ForeignKey(Gallery) 
    image = models.ImageField(upload_to='gallery/%Y/%m/%d') 
    caption = models.TextField(blank=True) 
    up_date = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return self.caption 

Je veux trois types de recherche:

  1. Obtenez toutes les « Galerie "avec une" Image "de cette galerie
  2. Obtenez toute l'image à partir d'une seule galerie

troisième que je peux gérer obtenir une image spécifique d'une "image"

+0

Quelle est la question? – Leopd

+0

Je ne comprends pas vraiment le n ° 1 ... –

Répondre

1

Je pense que je comprends ce que vous cherchez .

Requête # 1

Vous voulez toutes les galeries, ainsi que d'une seule image pour chaque galerie. Puisque Django vous permet automatiquement d'accéder aux objets liés, vous pouvez y parvenir en récupérant simplement toutes les galeries de votre base de données. Automatiquement les relations de clé étrangère "suit" quand elle exécute la requête, ce qui signifie que l'utilisation ultérieure des relations de clé étrangère ne nécessitera pas de requêtes de base de données.

#selects all galleries ordered from newest to oldest 
galleries = Gallery.objects.order_by('-pub_date').select_related() 

Pour obtenir la première image de chaque galerie dans votre modèle, vous feriez ceci:

{% for gallery in galleries %} 
    {{ gallery.name }} 
    <img src="{{ gallery.image_set.all.0.image }}"> 
{% endfor %} 

https://docs.djangoproject.com/en/dev/ref/models/querysets/

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

Requête n ° 2

Cela fonctionne exactement comme la requête précédente, mais pour une seule galerie.

gallery = Gallery.objects.get(id=gallery_id).select_related() 

Dans votre modèle:

{% for image in gallery.image_set.all %} 
    <img src="{{ image.image }}"><br> 
    {{ image.caption }} 
{% endfor %}  
1

Pour # 2:

Si g est une galerie, utilisez alors:

g.image_set.all() 
2

Pour # 1: Il y a une seule galerie pour chaque image. Si vous avez un objet image img alors la galerie pour elle est

gallery = img.gallery 

Pour # 2: Pour obtenir toutes les images pour une galerie:

imgs = gallery.image_set.all()