Exercices Concepts Web & Django Méthodes et propriétés de modèle
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Méthodes et propriétés de modèle

Un modèle Django n'est pas juste un sac de données. Tu peux y ajouter des méthodes et des propriétés pour encapsuler la logique metier. C'est une bonne pratique : le modèle sait comment se comporter.

Une propriété Python se definit avec le decorateur @property. Elle se comporte comme un attribut en lecture seule :

class Produit(models.Model):
prix_ht = models.FloatField()
tva = models.FloatField(default=0.20)

@property
def prix_ttc(self):
return self.prix_ht * (1 + self.tva)

# Utilisation : produit.prix_ttc (sans parentheses)

Definis un modèle Product avec :
- name : CharField max 100
- price : FloatField (prix unitaire HT)
- stock : IntegerField, défaut 0
- description : TextField, blank=True

Ajoute ces méthodes et propriétés :

- @property is_available(self) : retourne True si stock > 0
- @property price_with_tax(self, tax_rate=0.20) : attention, une property ne peut pas prendre de paramètre. Fais-en une méthode classique get_price_with_tax(self, tax_rate=0.20) qui retourne price * (1 + tax_rate), arrondi a 2 decimales. Et une @property price_with_tax qui appelle get_price_with_tax() avec le taux par défaut.
- reduce_stock(self, quantity) : reduit le stock de quantity. Retourne True si c'etait possible (stock suffisant), False sinon (et ne modifie pas le stock dans ce cas).

Meta avec app_label = 'test'.

Exemple :

champs = {f.name: f for f in Product._meta.get_fields()}
'name' in champs vaut True

Tests (4/5)

Champs definis
fields = {f.name for f in Product._meta.get_fields()}
assert 'name' in fields and 'price' in fields and 'stock' in fields
is_available
p = Product(name='Test', price=10.0, stock=5)
assert p.is_available == True
p2 = Product(name='Vide', price=5.0, stock=0)
assert p2.is_available == False
price_with_tax
p = Product(name='Test', price=100.0, stock=1)
assert p.price_with_tax == 120.0
assert p.get_price_with_tax(0.10) == 110.0
reduce_stock OK
p = Product(name='Test', price=10.0, stock=5)
assert p.reduce_stock(3) == True and p.stock == 2

+ 0 tests cachés

Indices (3 disponibles)

solution.py