I am working on a project which has two different sets of users - Customer
and Merchant
.
Both of these users should be able to register and login to their
respective profiles. The most obvious choice to implement this that came
to my mind was to make two different models Customer
and Merchant
that inherit from a BaseUser model that will store the common fields i.e. Multi-table inheritance - https://docs.djangoproject.com/en/1.8/topics/db/models/#multi-table-inheritance
Quoting Two Scoops of Django
-
At all costs, everyone should avoid multi-table inheritance (see warning above) since it adds both confusion and substantial overhead...
Adds substantial overhead since each query on a child table requires joins with all parent tables.
I would like to know if and why having an explicit OneToOneField
is better than Multi-table inheritance. Also, are there any other better ways to model the above relationship?
I personally like a profile model, but if you implement two you may have headaches when doing a reverse relation from user, you would need to check every time of the request.user is a customer or merchant.
In any case what is the difference between them anyway? Why can't a user be both?
--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/81954b62-2c89-404f-94a5-5f9a485c28c8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
You surely can use Choice field for either Customer or Merchant in your custom user class.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAFWa6tJar_3PcyOytTsY1EKhbW4Y7M45Kqnt4oU3VLyvGjfrEw%40mail.gmail.com.
If you want to avoid MT inheritance, look at inheriting from AbstractBaseUser using a custom abstract class where you can add your extra custom fields. Your two types of users (inheriting from your new abstract class) would then be standard, separate models.
-James
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CA%2B4-nGrDx8Aqiu6Xz%3Dwm_OMWgk_rC-kWBv_WGj%3DurWZNTE8LzA%40mail.gmail.com.
--
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/aV_PTRRD__s/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 http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CA%2Be%2BciUUsqDvWwtNzkBuM-_Rg7YB6tFTDS7ShjCzHte%3Du5nvkA%40mail.gmail.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAON2ci%2B1xCAxqVpyJkn_UN3B_GTF1FUDCEdVJF1zym-QvWB9eA%40mail.gmail.com.
class User(AbstractBaseUser, PermissionsMixin):
common_fields_go_her = ...
objects = CustomUserManager()
class Meta:
abstract = True
class Customer(User):
customer_specific_fields = ...
class Merchant(User):
merchant_speicifc_fields = ...
Hi James,
Correct me if I am wrong but if I understood you correctly, I should be able to implement it this way -
class User(AbstractBaseUser, PermissionsMixin):
common_fields_go_her = ...
objects = CustomUserManager()
class Meta:
abstract = True
class Customer(User):
customer_specific_fields = ...
class Merchant(User):
merchant_speicifc_fields = ...
In this case, what would be AUTH_USER_MODEL? If i am not wrong, an abstract base class cannot be an AUTH_USER_MODEL.
-James
Hi James, thanks for the elaborate answer. Not that explicit OneToOne relationships are bad but I was just trying to avoid the overhead due to the JOINs that comes with it.