I’m creating a user profile class for my new django website, and I am trying to decide how to represent a user’s physical address in my models.
Is it better practice to create a new subclass of model and reference it with a OneToOne key like
class UserProfile(models.Model):
...
address = models.OneToOneField(AddressModel)
...
class AddressModel(models.Model)
street_address = models.CharField(max_length=30)
city = models.CharField(max_length=15)
....
or is it better to create a new address field like
class UserProfile(models.Model):
...
address = AddressField(location_dict)
...
class AddressField(models.Field)
# details go here
...
I generally find it useful to have separate models if the entries might be created independently. For example, if you might end up with a collection of addresses AND a collection of users, not all of which will be linked immediately, then I’d keep them separate.
However, if all addresses in your database will always and immediately be associated with a user, I’d simply add a new field to the model.
Note: some people will tell you that it’s wrong and evil to have nullable database columns, and that you should therefore have a separate model if any of your addresses will ever be
None. I disagree; while there are often many great reasons to avoid nullable columns, in cases like this I don’t find the inconvenience of checking for a null address any more onerous than checking whether the one-to-one model entry exists.