2017-05-01 3 views
0

Pouvez-vous définir une fonction dans un modèle Django qui utilisera la fonction .save().Fonctions de classe de modèle personnalisées Django - .save()

Class Restaurant(models.Model) 
    name = models.CharField(max_length=25) 
    rating = models.PositiveIntegerField(validators=[MaxValueValidator(100), MinValueValidator(0)], default=50) 

    def change_rating(self, value) 
     self.rating += value 
     self.rating.save() 

Est-ce que cela fonctionnera? Est-ce que ce sont les meilleures pratiques?

Est-il préférable d'accomplir cela dans les vues comme ceci:

*views.py 

def change_rating(name, amount): 
    res = Restaurant.objects.get(name=name) 
    res.rating += amount 
    res.save() 

Merci pour l'aide!

+0

Avez-vous essayé? Quelle raison avez-vous de penser que ce ne serait pas une bonne pratique? –

+0

Mes compétences en programmation sont au niveau «Je peux le faire fonctionner». J'étais curieux de savoir s'il y avait quelque chose dont je ne suis pas au courant qui ferait une autre façon d'accomplir cette meilleure option. Vraiment, je cherche juste des opinions et des pensées. –

Répondre

-1

Je suggère les gestionnaires de modèle pour ce genre de cas

model_managers.py

from django.db import models 

class CustomManager(models.Manager): 

    def change_rating(self, value, **kwargs): 
     x = self.get(**kwargs) 
     x.rating += value 
     x.save() 

models.py

from . model_managers import CustomManager 

class Restaurant(models.Model): 
    name = models.CharField(max_length=25) 
    rating = models.PositiveIntegerField(validators=[MaxValueValidator(100), MinValueValidator(0)], default=50) 
    objects = CustomManager() 

    def __unicode__(self): 
     return self.name 

de commande d'exécution

Restaurant.objects.change_rating(25, name=name) 
+0

Cela semble être une utilisation inutile des gestionnaires, qui sont pour les opérations * class * -level. –