Dans mon modèle nommé XBlockState, j'ai plusieurs champs, parmi lesquels scénario et scenarioID définis comme ceci

scenario = models.CharField(
    max_length=255,
    blank=True,
    null=True,
    db_index=True,
)
scenarioID = models.CharField(
    max_length=255,
    blank=True,
    null=True,
    db_index=True,

)

Je dois définir une valeur sur scenarioID dans le format suivant

scénario.0

-1
ChemseddineZ 3 avril 2017 à 20:04

2 réponses

Meilleure réponse

Ce n'est probablement pas le plus propre mais cela devrait faire l'affaire:

Vous pouvez ajouter un champ scenarioID

scenarioID = models.CharField(max_length=255, blank=True)

Et écrasez la méthode save pour forcer sa mise à jour chaque fois que vous enregistrez un élément. Ensuite, vous pouvez y accéder et l'utiliser pour le filtrage, et dans un objet sérialisé.

## in models.py ##

class XBlockState(models.Model):
## other fields
...
#scenarioField

scenario = models.CharField(
    max_length=255,
    blank=True,
    null=True,
    db_index=True,
)

def scenarioID_calc_field(self):
    return self.scenario+"."+str(self.pk)

def save(self, force_insert=False, force_update=False, using=None):
    self.scenarioID = self.scenarioID_calc_field() #as defined higher
    super(XBlockState, self).save()
0
Malcoolm 5 avril 2017 à 14:31

Je ne suis pas sûr de bien comprendre:

1 / Soit vous voulez dire que scenarioID est un champ qui lui est propre , auquel cas:

Views.py

new_scenario = XBlockState.objects.create(
    scenario = "Django Unchained",
    scenarioID = "0"
    )
new_scenario.save()

2 / Ou vous voulez que scenarioID soit un champ calculé à partir de la clé primaire, auquel cas vous voudriez regarder quelque chose comme:

Models.py

class XBlockState(models.Model):
    ## other fields
    ...
    #scenarioField

    scenario = models.CharField(
        max_length=255,
        blank=True,
        null=True,
        db_index=True,
    )

    def scenarioID(self):
        return self.scenario+"."+str(self.pk)

Et vous pouvez accéder à ce champ n'importe où en utilisant quelque chose comme

xblockstate_instance.scenarioID()
0
Malcoolm 3 avril 2017 à 20:23