Yeah, a mechanism where you can subclass User **and use your subclass in lieu** is quite similar to what I suggested and, I agree, solves the problems I raise.
A subclass is also going to be substantially cleaner than having a new special way to add fields. Then we just need a Django setting to specify the User subclass, and which would check to ensure that any expected fields/methods are appropriately set (e.g. that it really does subclass User, or if it doesn't, that it duck types it comprehensively). Best Regards, Luke On March 16, 2012, at 13:15 , Donald Stufft wrote: > On Friday, March 16, 2012 at 2:08 PM, Luke Sneeringer wrote: >> Disclaimer: I was up really, really early this morning, so please bear with >> me if I sound somewhat incoherent... >> >> On March 16, 2012, at 12:29 , Tom Evans wrote: >> >>> On Fri, Mar 16, 2012 at 4:53 PM, Jacob Kaplan-Moss <ja...@jacobian.org> >>> wrote: >>>> Hi folks -- >>>> […] >>> >>> I'm not in favour of pluggable user models, as for me, they solve the >>> wrong problem. A pluggable user model has to be set up by the project >>> developer, whilst the attributes an app may need are specified solely >>> by the app developer. >>> >>> If a project developer decides to add a 3rd party app to his project, >>> where do the user preferences for that app live? Does the user model >>> automatically get expanded with the extra fields required by that app? >>> It all seems icky to me. >>> >>> To my mind, User + app specific user profiles are the correct >>> approach, plus fixing the current minor issues with d.c.a., and >>> providing tools and documentation to allow users to manage that >>> change. >>> >>> Put another way, what does a pluggable user model get us? What is the >>> big selling point, apart from being able to specify arbitrary columns >>> to appear in auth_user rather than myapp_userprofile. >> >> I personally find the User/Profile mechanism in Django to be quite awkward, >> to be honest. It's certainly not the end of the world, but it'd be nice if >> it was...less contrived feeling. >> >> I have an interesting suggestion/compromise: What about a mechanism that >> allows the app developer to *add* fields to the User model, but not change >> (or remove) existing keys? From my vantage point, this would have nearly all >> of the benefits of a pluggable user model with almost none of the drawbacks, >> and it would feel much more straightforward than the current mechanism. >> There may be some reason that I'm missing as to why this is foolish, though. >> >> Here's my hit list of perceived benefits: >> 1. It regains the efficiency of a single table (which is minor, to be sure, >> but since Jacob already brought it up...) > This issue isn't as minor as one might think I don't believe. I've recently > started using the fetch_related thing (which would be the only way to prevent > N queries when trying to select a bunch of users + their profiles) and on a > table with 20k entries (this isn't User related) where the entries are fairly > large the processing time to fetch them all was very significant. This effect > would increase with Tom's per app profile issue. >> >> 2. It allows app developers who just need a little bit more than what the >> User model does to add their custom fields seamlessly. This would mean, for >> instance, > The subclassable user model that django-primate uses solves this as easily as > it does the base fields. >> >> a. That the admin would just magically have the new fields in the User form, >> instead of having to either plug in a custom form, set up a separate >> ModelAdmin for your profile, or whatever else. For registration, we could >> offer two stock forms (one minimalist one, and one complete one that just >> blindly uses every field we don't know we want to exclude (e.g. is_staff)). >> If neither form works for the end developer, then they write and use their >> own. >> >> b. That the end developers don't have to write repetitive glue code on every >> one of their projects to make their profile models work. (Why do I have to >> write a signal to auto-save a profile object on User object save every time, >> for instance?) >> >> 3. We don't have myapp_userprofile. This is kind of a big deal to me, >> because in most of my projects there is no "clear" / "correct" place for >> this model to live -- there's no single app that handles users, because >> that's what django.contrib.auth is supposed to do. Getting these arbitrary >> columns into auth_user is a nice categorization win. >> >> If I understand this correctly, we avoid the following drawbacks of a fully >> pluggable system: >> 1. Apps can still be written to expect certain fields on User to exist, >> because the customization only allows the addition (not alteration) of >> fields. > This is somewhat of a red herring I think. With any pluggable system you'll > have a minimal set of required attributes. This minimum set of required is > going to depend greatly on what apps you have installed. Some sites the only > minimum would be the fact that a user model exists at all, some would require > username, email, first and last name. >> >> 2. We aren't expecting nearly every Django installation to write their own >> User model just to make a small addition to what stock Django offers; if you >> want just an extra field for birthdate, you don't write an entire custom >> user model; you just add the field. Since "I just want a few extra fields" >> is (other than the email address / username snafu) probably the most common >> need for auth, making this easy is a big win. >> >> What this does *not* solve is a situation where there's a field on User >> that's somehow wrong, such as the 30/75 character limitations on usernames >> and email addresses. Presumably this is done as part of a completionist >> revamp where we also fix those problems. > A subclassable usable model similar to primate does solve this issue. >> >> Best Regards, >> Luke >> >> P. S. I've lurked on the Django dev list for a long time, but never gotten >> my feet wet. That said, the improvements to auth being discussed are >> something I really want, and I want them enough to help out non-trivially if >> afforded the opportunity. I was planning on emailing Carl and Russell to >> pick their brains later, but maybe it's worth a public statement. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Django developers" group. >> To post to this group, send email to django-developers@googlegroups.com. >> To unsubscribe from this group, send email to >> django-developers+unsubscr...@googlegroups.com. >> For more options, visit this group at >> http://groups.google.com/group/django-developers?hl=en. > > > -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To post to this group, send email to django-developers@googlegroups.com. > To unsubscribe from this group, send email to > django-developers+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-developers?hl=en. -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.