2011-04-20 5 views
3

Je voulais écrire un code comme ceci:Vérifiez si un champ non annulable est nul (Django)

class SomeModel(models.Model): 

    field = models.ForeignKey(SomeOtherModel) 

    def __init__(self, *args, **kwargs): 
     super(SomeModel, self).__init__(*args, **kwargs) 
     if self.field is None: 
      self.field = SomeOtherModel() 

    ... 

Cependant, cela soulève self.field.rel.to.DoesNotExist. Le code Django est très clair sur ce point:

class ReverseSingleRelatedObjectDescriptor(object): 

    def __get__(self, instance, instance_type=None): 

     ... 

     if val is None: 
      # If NULL is an allowed value, return it. 
      if self.field.null: 
       return None 
      raise self.field.rel.to.DoesNotExist 

Je suis presque certain que cette question a été soulevée auparavant, j'étais cependant en quelque sorte pas en mesure de trouver quelque chose qui correspondrait à ce usecase particulier. Une solution de contournement évidente serait bien sûr de rendre le champ nullable cependant autant que je comprenne que cela aurait réellement un effet sur le schéma de base de données, aussi j'aime les contrôles d'intégrité offerts par Django. Un autre serait d'attraper l'exception et de le gérer de manière appropriée. Cependant, cela ajoute beaucoup de code standard. Surtout quand il y a plusieurs champs comme ça (un bloc séparé de try...except pour chacun d'entre eux - maintenant c'est moche). Que suggérerais-tu?

EDIT: Une autre chose - je pourrais utiliser initial mais c'est assez limité quand il s'agit de clés étrangères. Je ne connais pas toujours le type de défaut que je voudrais avoir au moment de la création. Je le connaîtrai cependant lors de la phase d'initialisation. De plus, il pourrait alors dépendre des valeurs des autres champs.

Répondre

10

Vérifiez si elle a l'attribut set -

if hasattr(self, 'field', False) 
+2

Je pense que cela devrait être 'hasattr (self, 'field')', mais oui cela fonctionne. Merci. – julkiewicz

+0

hasattr attend 2 arguments, a obtenu 3 –

0

bonne façon de se référer un champ sous forme est comme ceci:
self.fields['myfield']
donc, dans votre cas, le chèque nul ne doit se présenter comme suit
D'autre part, n'utilisez pas les mots réservés/proches des mots réservés comme 'field' pour nommer vos champs.

+0

Je ne peux pas penser à un sens significatif dans lequel le mot «champ» est «réservé» en Python. En Python, les objets sont constitués d'attributs et de méthodes. –

+0

rien ne casse vraiment avec 'champ'. mais je parle de DJango. Ici, le formulaire a l'attribut fields et utilise à nouveau des mots similaires pour représenter un élément personnalisé rendant le code confus pour d'autres programmeurs. Bonne/appropriée nom de variable est toujours facile à lire et à comprendre. –

+0

C'était juste un exemple. Dans mon modèle actuel, le nom du champ est quelque chose de totalement différent. – julkiewicz

Questions connexes