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