Django: Why create a OneToOne to UserProfile instead of subclassing auth.User?

后端 未结 3 1254
梦毁少年i
梦毁少年i 2020-12-05 16:38

Note: If you are tempted to \'answer\' this question by telling me that you don\'t like django.contrib.auth, please move on. That will not be helpful. I am well aware of t

3条回答
  •  萌比男神i
    2020-12-05 17:18

    There's never really been a good explanation, at least from "official" sources as to why, in practice, subclassing User is less useful than having a UserProfile.

    However, I have a couple of reasons, that came up after I had decided myself that subclassing User was "the way to go".

    • You need a custom authentication backend. This is not a big issue, but the less code you need to write, the better.
    • Other apps may be assuming that your User is a django.contrib.auth.models.User. Mostly this will be okay, unless that code is fetching User objects. Because we are a subclass, any code just using our User objects should be fine.
    • A User may only 'be' one sub-class at a time. For instance, if you had User subclasses of Student and Teacher, then at a given time, your User would only be able to be a Teacher or a Student. With UserProfiles, there could be both a Teacher and a Student profile attached to the same user at the same time.
    • Following on, converting from one sub-class to another is hard: especially if you have an instance of one sub-class already.

    So, you may say, "my project will only ever have the one User subclass". That's what I thought. Now we have three, plus regular Users, and possibly a fourth. Requirements change, having to change heaps of code to deal with that is not much fun.

    note: There has been quite a lot of discussion on django-developers recently about a better fix to the issues related to the contrib.auth User model.

提交回复
热议问题