Hi Frankline,

On 10/27/2014 12:38 AM, Frankline wrote:
> I am having problems with my custom user model while using Django 1.7.1
> and Python 3.4.
> I have declared a Custom user model in an apps.users.AuthUser. I then
> have another application (apps.pets) that will use the AuthUser as a
> ForeignKey in a Pet model. See below:
> 
> class Pet(models.Model):
>     owner = models.ForeignKey(settings.AUTH_USER_MODEL, db_index=True,
> blank=False, null=False)
> 
> This is my scenario:
> 
> In my INSTALLED_APPS I have: "apps.users"
> 
> If I set AUTH_USER_MODEL="apps.users.AuthUser" the exception is raised
> when I run 'runserver':
>   File
> "/home/frank/.virtualenvs/myproj/lib/python3.4/site-packages/django/contrib/auth/checks.py",
> line 12, in check_user_model
>     cls = apps.get_model(settings.AUTH_USER_MODEL)
>   File
> "/home/frank/.virtualenvs/myproj/lib/python3.4/site-packages/django/apps/registry.py",
> line 201, in get_model
>     app_label, model_name = app_label.split('.')
> ValueError: too many values to unpack (expected 2)
> 
> 
> If I set AUTH_USER_MODEL="users.AuthUser" the exception is raised when I
> run migrate:
>   File
> "/home/frank/.virtualenvs/myproj/lib/python3.4/site-packages/django/db/migrations/state.py",
> line 89, in render
>     model=lookup_model,
> ValueError: Lookup failed for model referenced by field pets.Pet.owner:
> users.AuthUser
> 
> Similar issue reported here I guess:
> https://code.djangoproject.com/ticket/19845
> 
> 
> Does this mean that in AUTH_USR_MODEL setting I have to use
> 'app_label.model_name' instead of 'apps.app_label.model_name.'? Is there
> a workaround for this?

Why is a workaround needed?

Django has the concept of "app label", which is usually the final
component of the app's import path (although in Django 1.7 with
AppConfig it no longer has to be). So for an app whose import path is
"apps.users", its app label is "users". And the format of
AUTH_USER_MODEL (like the format for string model references elsewhere
in Django) is simple "app_label.ModelName", not a full Python import path.

So having "apps.users" in INSTALLED_APPS and "users.User" in
AUTH_USER_MODEL is fully correct and normal; there is no bug there, and
no need for a workaround.

(That said, I do find the whole concept of app-label unfortunate -- why
not just use full import paths and avoid conflicts between "foo.users"
and "bar.users"? -- and especially the use of dotted syntax in
"app_label.ModelName", which looks so much like an import path. But
nevertheless, app labels are a long-standing part of Django legacy which
can't be easily excised.)

Carl

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to