Как инициализировать поле в Django моделях, используя другие поля в модели - PullRequest
0 голосов
/ 16 апреля 2020

Я хотел бы вызвать API, который будет возвращать широту и долготу из почтового индекса, который является частью моей 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)

Поэтому, когда создается объект медсестры, я хотел бы вызвать API (postcode.io), что означает, что я могу получить широту и долготу на основе почтового индекса, который сохраняет эти значения в модель данных. Мне нужны широта и долгота, потому что я использую их в шаблоне, где мне нужен доступ к этой информации.

Спасибо!

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Этого можно добиться, определив методы модели .

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 голосов
/ 18 апреля 2020

Лучший способ, который я нашел, - это использовать метод @James Bond по следующей причине:

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)

Я всего лишь хороший разработчик, но вот моя причина, если это поможет вам.

Этот метод означает, что каждый раз, когда я обновляю объект медсестры ie. Изменить с помощью формы или когда я первоначально добавлю новый экземпляр медсестры, он автоматически заполнит необходимые поля, и это здорово. Однако я вижу, что это может быть плохо, потому что он вызывает API каждый раз, когда я обновляю экземпляр, что может привести к ошибкам, но для моего использования это нормально и отличное решение.

Надеюсь, это поможет :)

0 голосов
/ 16 апреля 2020

Вы можете сделать это в save (), если это изменится, или init (), если это должно произойти только один раз.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...