[英]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.