如何使用模型中的其他字段初始化Django模型中的字段

时间:2020-04-16 18:55:30

标签: python django model

我想调用一个API,该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 个答案:

答案 0 :(得分:1)

您可以通过定义 model methods 来实现。

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

答案 1 :(得分:0)

如果它会更改,则可以在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)

答案 2 :(得分:0)

我发现最好的方法是使用@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)

我只是一个好的开发人员,但是如果这可以帮助您,这就是我的原因。

此方法意味着每次我更新护士对象即。通过表单进行更改,或者当我最初添加护士的新实例时,它将自动完成必填字段,这非常好。但是,我看到这很不好,因为每次更新实例时都会调用api,这可能会导致错误,但是对于我来说,这是很好的解决方案。

我希望这会有所帮助:)