Django Multiple User Profiles Best Practices

1,529 views
Skip to first unread message

Sudhanshu Shekhar

unread,
Apr 6, 2016, 11:41:54 PM4/6/16
to Django users
Hi,

I am creating a tutor-student forum using Django. For which I need to have two different user profiles, one for students and one for teachers. However, I am unsure about the best way to do this. I am currently following the below approach:

class UserProfile:
 user
= models.OneToOneField(User, reverse_name="profile")
 
#other common Attributes
 
class Meta(object):
   
abstract = true

class TutorProfile():
 
#tutor fields
 
class Meta(object):
   
abstract = true

class StudentProfile():
 
#student fields
 
class Meta(object):
   
abstract = true

class Profile(TutorProfile, StudentProfile, UserProfile):
 
pass


The idea is taken from the Django best practices book. However, I am curious if there is any other way with lesser space usage. Any thoughts?

PS: I also asked the same question on stackoverflow : http://stackoverflow.com/questions/36404889/django-multiple-user-profiles-with-class-based-views-best-practices but didn't get any responses.

Peter of the Norse

unread,
May 3, 2016, 2:18:17 AM5/3/16
to django...@googlegroups.com
First of all, I don’t like multiple inheritance.  You are in control of all of the parent classes, so it might not blow up in your face, but there still night be problems down the line.  Second, I think this might be the same as just creating a single class with all of the fields, so there’s no reason to create three abstract classes for it to inherit from.

How old is the Django best practices book you are using?  Because starting with 1.5, you should be using a custom User model instead of a constant profile.

What I would do, and I’d love to hear some debate about it, is put most (or all, depending on requirements) of the fields from the UserProfile in the new custom user model, and have two not-abstract profiles with one-to-one fields to the user.  If the things in UserProfile don’t make sense for all users, then make three profiles which all point to the custom user model.

Peter of the Norse



Sudhanshu Shekhar

unread,
May 5, 2016, 5:48:26 AM5/5/16
to django...@googlegroups.com
Hey,

Thanks for the reply. The book was released in March 2015 and I am sure the authors would've known about the custom user models. It has some very good suggestions (For intermediate django devs like me at least), though yeah, this abstract model inheritance idea did seem a little troubling to me too.

I finally ended up creating a single profile with a `user_type` field dictating which kind of user this was. And I created a json field to store all the relevant details of this user.
I think I could get away with it because in my case all of these fields are primarily for information and I don't need to search/index by them (which would've been a pain since I couldn't query them).

One of the reasons why I avoided the custom user model was because most blogs discourage the idea (mainly because of troubles with integrating with other apps). I will rethink my approach given your suggestion though.

Have you tried the custom user model with multiple one-to-one profiles approach anywhere till date? How do you handle registration in that case? Eg: Teacher signup form would be different from student signup form. So have you over-ridden the registration view and then create the profile based on other form parameters? I am planning to do this only but would love to know how others have done this already.

One more thing I realized : Django doesn't have a good registration app that can handle such multiple profiles, registrations and workflows. Eg: What if I want students to be able to login directly/after email verifications but teachers need to fill in their profile and wait for admin approval before they can proceed.

Seems weird as the requirement would be valid for a lot of websites nowdays. Or is there a good alternative I am missing out on?

--
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/django-users/JfnvYidq2Us/unsubscribe.
To unsubscribe from this group and all its topics, send an email to django-users...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/D4629C3B-5B67-439B-B6B7-0EA2CC7CDFF5%40Radio1190.org.
For more options, visit https://groups.google.com/d/optout.



--
Regards,
Sudhanshu Shekhar

Imtiaz Ahmed

unread,
Sep 18, 2022, 12:10:01 PM9/18/22
to Django users
Hello. the conversation is quite old. But I'm facing a problem similar to this.
I'm doing exactly what Peter of the Norse suggested here. With this architecture (CustomUser and Profiles with OTO relation) I'm able to get data from both models into single endpoint, but when it comes to PUT it throws error saying some field(from profile) is not field of CustomUser. Let me explain more, I wrote a serializer where I combined both CustomUser and Profile. then I override the update method where I implemented the mechanism to separate profile data from the payload and save separately. I sharing my serializer class :
Serializer.png

As you can see my serializer is designed in nested style, but my print of validated_data shows that its receiving a non nested object. Can you please shed some light on this? what am I missing out here? 

Reply all
Reply to author
Forward
0 new messages