2010-01-28 4 views
1

Étant donné un modèleComment créer un champ modèle django qui a une valeur par défaut si jamais à null

class Template(models.Model): 
    colour = models.CharField(default="red", blank = True, null=True) 

Comment puis-je arranger pour que tout accès à la couleur soit renvoie la valeur stockée dans le champ, ou si le champ est vide/null alors il retourne en rouge?

Le

default=red
mettra « rouge » dans le domaine quand il est créé, mais si elle est alors édité à blanc je voudrais y accéder revenir « rouge », et non « »

Mise à jour: J'ai essayé la solution de propriétés proposée ci-dessous, mais je l'utilise sérialisation JSON pour mettre en œuvre une API REST et les propriétés (par exemple colour) ne reçoivent aucun numéro de série, et sérialisation les _colour brise l'API

Répondre

0

Voilà comment j'ai fini par résoudre ce problème. D'abord quelques préconditions: J'ai un code existant qui accède à ces noms de champs (par exemple 'couleur') et le champ est également sérialisé (par django-rest-interface) dans le cadre d'une API. Aucune de ces choses ne peut être changée.

L'essai de la méthode des propriétés a bien fonctionné, sauf que colour n'était plus un champ et n'a donc pas été sérialisé. Résultat: API cassé

ensuite déplacé vers la solution de sauvegarde(), avec un attribut personnalisé sur chaque champ qui devrait se comporter comme ceci:

class ColourChoices(models.Model): 
    colour1 = models.CharField() 
    colour1.colour_default = "red" 
    colour2 = models.CharField() 
    colour2.colour_default = "blue" 

    def save(self, *args, **kwargs): 
     # force colour fields to default values 
     for f in [ x for x in self._meta.fields if hasattr(x, 'colour_default') ]: 
      if self.__getattribute__(f.attname) == "": 
       self.__setattr__(f.attname, f.colour_default) 
     super(ColourChoices, self).save(*args,**kwargs) 

Maintenant, tout fonctionne très bien et au besoin. Le seul problème avec cette solution est que si les valeurs par défaut changent il est impossible de dire quels champs de base de données devraient avoir des valeurs par défaut mises à jour, et qui sont accidentellement la même couleur que l'ancienne valeur par défaut. Cependant, pour mon application, je peux vivre avec cela.

1

Utilisez la méthode save mettre en œuvre.

def save(self, *args, **kw): 
    if self.colour is None: 
     self.colour= 'red' 
    super(ThisModel, self).save(*args, **kw) 
+0

Cela modifie la valeur stockée, ce qui n'est pas ce que je veux arriver –

4

Vous pouvez créer une méthode distincte à la place:

def get_colour(self): 
    if not self.colour: 
     return 'red' 
    else: 
     return self.colour 

Une alternative est d'utiliser la propriété.

http://www.djangoproject.com/documentation/models/properties/

+0

Je préfère cette solution car elle ne modifie pas la valeur du champ du modèle. Sauf si la modification du champ est ce que vous voulez. – jathanism

+0

Je ne peux pas changer mon code pour accéder au champ via get_colour partout - donc toutes les lectures/écritures doivent rester en couleur. Les propriétés semblent pouvoir fonctionner. Y at-il un moyen facile de générer beaucoup de fonctions de propriétés répétitives (j'ai beaucoup de champs de couleur dans le modèle, et chacun aura besoin d'emballage) –

+0

@Malcolm Box: la meilleure façon de gérer votre exigence de beaucoup de champs de couleur serait d'avoir une classe abstraite avec les propriétés appropriées qui sont partagées entre de nombreux modèles (couleur et tout autre que vous pourriez avoir). Voir: http://docs.djangoproject.com/en/dev/topics/db/models/#id6 – cethegeek

Questions connexes