簡體   English   中英

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

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM