首页 > 解决方案 > 'NoneType' 对象在更改模型时没有属性 '_meta'

问题描述

我正在尝试重组我的数据库模型以包含比django.contrib.auth.models.User. models.py但是,对和进行更改views.py,然后运行python manage.py makemigrations并不能正确更新我的迁移。显然,Django 仍然认为我使用的是代理模型。

我不得不进行更改users/migrations/0001_initial.py以避免依赖错误,然后我运行python manage.py makemigrations并得到了No changes detected.

users/migrations/0001_initial.py (更改前)

# Generated by Django 2.2 on 2019-05-01 03:13

from django.db import migrations
import users.managers


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('auth', '0011_update_proxy_permissions'),
    ]

    operations = [
        migrations.CreateModel(
            name='Person',
            fields=[
            ],
            options={
                'proxy': True,
                'constraints': [],
                'indexes': [],
            },
            bases=('auth.user',),
            managers=[
                ('objects', users.managers.PersonManager()),
            ],
        ),
    ]

users/migrations/0001_initial.py (修改后)

# Generated by Django 2.2 on 2019-05-01 03:13

from django.db import migrations
import users.managers


class Migration(migrations.Migration):

    initial = True

    dependencies = []

    operations = []


users/models.py (更改前)

from django.db import models
from django.contrib.auth.models import User
from . import managers

class Person(User):
    objects = managers.PersonManager()

    class Meta:
        proxy = True

users/models.py (修改后)

from django.db import models
from django.contrib.auth.models import User
from users import managers

class Profile:
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.CharField(max_length=30)
    objects = managers.ProfileManager()

users/views.py

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from users.models import Profile

def index(request):
    profile = Profile.objects.get(user_pk=request.session['id']) \
        if 'id' in request.session else None

    return render(request, 'users/index.html', {
        'profile': profile,
    })


def login(request):
    valid, response = Profile.objects.login_register(request, 'login')

    if not valid:
        for error in response:
            messages.error(request, error)
        return redirect('users:index')

    profile = Profile.objects.get(pk=response)
    messages.success(request, 'Welcome back, %s!' % profile.user.first_name)
    request.session['id'] = response
    return redirect('users:index')


def register(request):
    valid, response = Profile.objects.login_register(request, 'register')

    if not valid:
        for error in response:
            messages.error(request, error)
        return redirect('users:index')

    messages.success(request, 'You have successfully created an account.')
    request.session['id'] = response
    return redirect('users:index')


def logout(request):
    del request.session['id']

    messages.success(request, 'You have successfully logged out.')
    return redirect('users:index')

当我尝试登录或注册时,我希望页面重新加载,登录/注册表单更改为用户的个人资料页面。

错误信息

Internal Server Error: /profile/
Traceback (most recent call last):
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/matt/Repositories/pharmasseuse/users/views.py", line 12, in index
    if 'id' in request.session else None
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/query.py", line 399, in get
    clone = self.filter(*args, **kwargs)
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/query.py", line 892, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/query.py", line 910, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1290, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1318, in _add_q
    split_subq=split_subq, simple_col=simple_col,
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1190, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1049, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "/home/matt/Repositories/pharmasseuse/env/lib/python3.5/site-packages/django/db/models/sql/query.py", line 297, in get_meta
    return self.model._meta
AttributeError: 'NoneType' object has no attribute '_meta'

任何帮助表示赞赏。

标签: pythondjangodjango-models

解决方案


我认为更改迁移文件不是一个好主意。您可以直接在模型中进行更改,并在更改模型后运行./manage.py makemigrations以生成新的迁移文件。

此外,您需要将模型类从以下子类化models.Model

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.CharField(max_length=30)
    objects = managers.ProfileManager()

更新

(来自评论)由于您的经理已更换,我认为您可以继续使用以下任一解决方案:

  1. 两者都保留ProfileManager,然后运行。PersonManagerusers.managermakemigrations
  2. 像这样更新迁移文件(从字典中删除管理器属性):
# Generated by Django 2.2 on 2019-05-01 03:13

from django.db import migrations
import users.managers


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('auth', '0011_update_proxy_permissions'),
    ]

    operations = [
        migrations.CreateModel(
            name='Person',
            fields=[
            ],
            options={
                'proxy': True,
                'constraints': [],
                'indexes': [],
            },
            bases=('auth.user',),
            # managers=[
            #     ('objects', users.managers.PersonManager()),
            # ],
        ),
    ]

推荐阅读