![](/img/trans.png)
[英]Django Models: Generate field content from other fields in model instance
[英]How to initialise a field in Django models using other fields in the model
我想调用一个 API,它将返回邮政编码的纬度和经度,这是我的 Django Model 的一部分
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)
因此,当创建护士 object 时,我想调用 api (postcode.io),这意味着我可以根据将这些值保存到数据 Z20F35E630DAF44DFA8CZC3F6 的邮政编码获得纬度和经度。 我需要知道纬度和经度,因为我在需要访问此信息的模板中使用了它。
谢谢!
您可以通过定义model 方法来实现这一点。
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
如果它会改变,你可以在 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)
我发现最好的方法是使用@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)
我只是一个不错的开发人员,但这是我的理由,以防万一这可以帮助你。
这种方法意味着每次我更新护士 object 即。 通过表格进行更改,或者当我最初添加护士的新实例时,它会自动完成必填字段,这很棒。 但是,我可以看到,这可能很糟糕,因为每次我更新可能导致错误的实例时它都会调用 api,但对于我的使用来说,这很好,也是一个很好的解决方案。
我希望这有帮助:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.