arcee123
arcee123

Reputation: 243

using "primary" field in django model

i have two models: Address and Phone. Inside each model, rests a "Default" boolean field. What I need it to do, is if I submit a True answer in a form, then all other records must be set to False for that user.

How do I accomplish this?

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

Upvotes: 0

Views: 44

Answers (1)

Xiao
Xiao

Reputation: 997

You can use post_save signal or override save method. Following is a simple snippet. If you want to keep consistent, put the these queries in a transaction.

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)

Upvotes: 2

Related Questions