Aller au contenu
Sebfie.

Petit pense bête sur comment retrouver les objets liés par des clés étrangères avec Django

Article d'archive. Publié il y a plus de six ans, il peut décrire des versions ou des pratiques qui ont depuis évolué. Nous le laissons en ligne pour sa valeur documentaire.

Dans mon cas d’utilisation j’ai deux models d’objets :
Le model pour une annonce d’appartement qui est liée à un évenement :

class Accommodation(models.Model):

    #Foreign keys
    user = models.ForeignKey(User, unique=False, verbose_name=_('user'))
    event = models.ForeignKey(Event, unique=False, verbose_name=_('event'),blank=True, null=True)

    #Attributes
    title = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    description = models.TextField()
    longitude = models.CharField(max_length=200, null=True)
    latitude = models.CharField(max_length=200, null=True)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    photo_count = models.CharField(max_length=2, null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    accommodates = models.IntegerField()
    bedrooms = models.IntegerField(null=True)
    views = models.IntegerField(null=True)
    last_modify_on = models.DateTimeField(auto_now_add=True)

Et l’évènement en lui même :

class Event(models.Model):

    def __unicode__(self):
        return self.title

    #Foreign keys
    created_by = models.ForeignKey(User, unique=False, verbose_name=_('created_by'))

    #Attributes
    title = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    description = models.TextField()
    longitude = models.CharField(max_length=200, null=True)
    latitude = models.CharField(max_length=200, null=True)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    created_on = models.DateTimeField(auto_now_add=True)

    def upload_path(self, filename):
        return 'upload/events/%s/%s' % (self.id, filename)

    photo = models.ImageField(upload_to=upload_path)

    start_on = models.DateTimeField()
    end_on = models.DateTimeField()
    views = models.IntegerField(null=True)
    displayed = models.BooleanField()
    last_modify_on = models.DateTimeField(auto_now_add=True)

Ma grande question du jour était donc : Comment faire pour retrouver à partir d’un évènement toutes les annonces associées ? . Rien de plus simple :

event = Event.objects.get(id=1)
annonces = event.accommodation_set
#On affiche le nombre d'appartements :
event.accommodation_set.count()

Et voici l’astuce du jour