Guruprasad
Guruprasad

Reputation: 1445

Multiple references to the same model in another model in Django

Hi I have a lot of users in my system who are classified into different types. I want to store the address details of all those users. For instance the user could be a student, a school or a franchisee. All the users here could have an address information associated with them.

from django.db import models
from django.contrib.auth.Models import User

class Address(models.Model):
    user = models.OneToOneField(User)
    address = models.TextField()

class Student(models.Model):
    user_id = models.ForeignKey(User)
    address = models.ForeignKey(Address)

class School(models.Model):
    user_id = models.ForeignKey(User)
    address = models.ForeignKey(Address)
    contact_person_name = models.CharField(max_length=50)

In this scenario there are 2 references to the User model - one through user_id and another through address.user though they should be referring to the same instance. Is it a bad practice to have duplicate references?

I thought of leaving out the 'user' foreignkey in Address, but I think that the address can't exist without a user. How to better model this?

Upvotes: 1

Views: 1147

Answers (1)

crodjer
crodjer

Reputation: 13634

As you already mentioned in question duplication of same field in a model is not a good Idea.

If these are your actual models, I would suggest you using abstract models:

from django.db import models
from django.contrib.auth.Models import User

class Profile(models.Model):
    user = models.OneToOneField(User, related_name="%(app_label)s_%(class)s_related")
    address = models.TextField()

    class Meta:
        abstract = True

class Student(Profile):
    pass

class School(Profile):
    contact_person_name = models.CharField(max_length=50)

This will generate two tables: students, schools with fields user, address and user, address, contact_person_name respectively.

Upvotes: 2

Related Questions