繁体   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