0
votes

Comment initialiser un champ dans les modèles Django à l'aide d'autres champs du modèle

Je voudrais appeler une API qui renverra la latitude et la longitude à partir d'un code postal qui fait partie de mon modèle Django

class Nurse(models.Model):
    firstName = models.CharField(max_length=100, default="")
    lastName = models.CharField(max_length=100, default="")
    postCode = models.CharField(max_length=10, default="")
    area = models.CharField(max_length=100)
    phoneNumber = models.CharField(max_length=20)
    email = models.EmailField(max_length=100, null=True)
    latitude = models.FloatField(max_length=10, null=True)
    longitude = models.FloatField(max_length=10, null=True)

Donc, quand un objet infirmière est créé, je voudrais appeler une api (postcode.io), ce qui signifie que je peux obtenir une latitude et une longitude en fonction du code postal qui enregistre ces valeurs dans le modèle de données. J'ai besoin d'avoir la latitude et la longitude car je l'ai utilisée dans un modèle où j'ai besoin d'accéder à ces informations.

Merci!


0 commentaires

3 Réponses :


1
votes

Vous pouvez y parvenir en définissant le modèle méthodes .

class Nurse(models.Model):
    firstName = models.CharField(max_length=100, default="")
    lastName = models.CharField(max_length=100, default="")
    postCode = models.CharField(max_length=10, default="")
    area = models.CharField(max_length=100)
    phoneNumber = models.CharField(max_length=20)
    email = models.EmailField(max_length=100, null=True)
    latitude = models.FloatField(max_length=10, null=True)
    longitude = models.FloatField(max_length=10, null=True)

def latitude(self):
   # here you can access the postCode of this model object using self.postCode

def longitude(self):
   # same can be done here


0 commentaires

0
votes

Vous pouvez le faire dans save () si cela change ou init () si cela est censé ne se produire qu'une seule fois.

class Nurse(models.Model):

    #Variant 1
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.longitude, self.lattitude = shadyAPI.giveAwayStrangersPersonalData(self.email, self.firstname, self.lastname, self.postcode, self.area, self.phoneNumber, get_user_model().objects.get(nursePK=self).password)

    #Variant 2
    def save(self, *args, **kwargs):
        self.longitude, self.lattitude = shadyAPI.giveAwayStrangersPersonalData(self.email, self.firstname, self.lastname, self.postcode, self.area, self.phoneNumber, get_user_model().objects.get(nursePK=self).password)
        super().save(self, *args, **kwargs)


1 commentaires

Merci, la sauvegarde est celle que je voulais! Merci très utile



0
votes

Le meilleur moyen que j'ai trouvé est d'utiliser la méthode de @James Bond pour la raison suivante.

class Nurse(models.Model):

    def save(self, *args, **kwargs):
        self.longitude, self.lattitude = shadyAPI.giveAwayStrangersPersonalData(self.email, self.firstname, self.lastname, self.postcode, self.area, self.phoneNumber, get_user_model().objects.get(nursePK=self).password)
        super().save(self, *args, **kwargs)

Je ne suis qu'un bon développeur, mais voici ma raison au cas où cela pourrait vous aider.

/ p>

Cette méthode signifie que chaque fois que je mets à jour l'objet infirmière ie. Changement via un formulaire ou lorsque j'ajoute initialement une nouvelle instance d'infirmière, elle remplira automatiquement les champs obligatoires, ce qui est génial. Je peux voir cependant que cela pourrait être mauvais car il appelle l'API à chaque fois que je mets à jour l'instance, ce qui pourrait entraîner des erreurs, mais pour mon utilisation, c'est bien et une excellente solution.

J'espère que cela aide: )


0 commentaires