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.
Je pense que cela devrait être 'hasattr (self, 'field')', mais oui cela fonctionne. Merci. – julkiewicz
hasattr attend 2 arguments, a obtenu 3 –