在django模型中使用“primary”字段

时间:2017-04-11 16:43:11

标签: django

我有两种型号:地址和电话。在每个模型中,休息一个“默认”布尔字段。我需要它做的是,如果我在表单中提交True答案,那么该用户的所有其他记录必须设置为False

我如何做到这一点?

class Address (models.Model):
    User = models.ForeignKey(User)
    Primary = models.BooleanField(default=True)
    Street = models.CharField(max_length=500)
    City = models.CharField(max_length=50)
    State = models.CharField(max_length=40)
    Zip = models.CharField(max_length=20)
    County = models.CharField(max_length=20)
    Country = models.CharField(max_length=50, default="United States")
    Latitude = models.FloatField(null=True, blank=True)
    Longitude = models.FloatField(null=True, blank=True)

    class Meta:
        verbose_name_plural = "Addresses"

    def __str__(self):
        primary = 'PRIMARY Address for ' if self.Primary else 'Address for '
        return primary + self.User.first_name + ' ' + self.User.last_name

    def save(self, *args, **kwargs):
        geolocator = Nominatim()
        location = geolocator.geocode("{} {}, {}, {}".format(self.Street, self.State, self.Zip, self.Country))
        self.Latitude = location.latitude
        self.Longitude = location.longitude
        super(Address, self).save(args, *kwargs)


class Phone (models.Model):
    User = models.ForeignKey(User)
    Primary = models.BooleanField(default=True)
    Country_Code = models.CharField(max_length=5, default="001")
    Area_Code = models.CharField(max_length=5, blank=True, null=True)
    Number = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
        return self.Country_Code + "-" + self.Area_Code + "-" + self.Number

1 个答案:

答案 0 :(得分:2)

您可以使用post_save信号或覆盖save方法。以下是一个简单的片段。如果要保持一致,请将这些查询放在事务中。

def save(self, *args, **kwargs):
    geolocator = Nominatim()
    location = geolocator.geocode("{} {}, {}, {}".format(self.Street, self.State, self.Zip, self.Country))
    self.Latitude = location.latitude
    self.Longitude = location.longitude
    super(Address, self).save(args, *kwargs)
    Address.objects.exclude(id=self.id).update(Primary=False)