2017-06-15 2 views
1

編集:新しいデータベースを使って完全に新しいdjangoプロジェクトを作成し、Pagesアプリケーションを作成して実際のファイルを新しいプロジェクトにコピーしてみました。明らかに、それは私が最後のものと間違っていたdjangoのバグか何かです。まったく新しいプロジェクトをいつも作りたいと思っていないので、私はそれが第二のものだと願っています!Django django.db.utils.ProgrammingError。 << Pages_account >>という関係は存在しません

私はDjangoを使い慣れました。実際にカスタムモデルのユーザーがいて、いつpython manage.py migrateしようとすると、次のエラーが発生します。 私はdjango 1.11とpostgresデータベースマネージャを使用しています。 注:英語で、それは次のとおりです。「関係< < Pages_accountは>>存在しない

Operations to perform: 
Apply all migrations: Pages, admin, auth, contenttypes, sessions 
Running migrations: 
Applying Pages.0002_auto_20170615_1214...Traceback (most recent call  last): 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-  packages\django\db\backends\utils.py", line 65, in execute 
return self.cursor.execute(sql, params) 
psycopg2.ProgrammingError: no existe la relación «Pages_account» 


The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
File "manage.py", line 22, in <module> 
execute_from_command_line(sys.argv) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site- packages\django\core\management\__init__.py", line 363, in execute_from_command_line 
utility.execute() 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site- packages\django\core\management\__init__.py", line 355, in execute 
self.fetch_command(subcommand).run_from_argv(self.argv) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\management\base.py", line 283, in run_from_argv 
self.execute(*args, **cmd_options) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\management\base.py", line 330, in execute 
output = self.handle(*args, **options) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\management\commands\migrate.py", line 204, in handle 
fake_initial=fake_initial, 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\migrations\executor.py", line 115, in migrate 
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\migrations\executor.py", line 145, in _migrate_all_forwards 
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\migrations\executor.py", line 244, in apply_migration 
state = migration.apply(state, schema_editor) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\migrations\migration.py", line 129, in apply 
operation.database_forwards(self.app_label, schema_editor, old_state, project_state) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\migrations\operations\fields.py", line 215, in database_forwards 
schema_editor.alter_field(from_model, from_field, to_field) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\base\schema.py", line 515, in alter_field 
old_db_params, new_db_params, strict) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\postgresql\schema.py", line 112, in _alter_field 
new_db_params, strict, 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\base\schema.py", line 684, in _alter_field 
params, 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\base\schema.py", line 120, in execute 
cursor.execute(sql, params) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\utils.py", line 80, in execute 
return super(CursorDebugWrapper, self).execute(sql, params) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\utils.py", line 65, in execute 
return self.cursor.execute(sql, params) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\utils.py", line 94, in __exit__ 
six.reraise(dj_exc_type, dj_exc_value, traceback) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\utils\six.py", line 685, in reraise 
raise value.with_traceback(tb) 
File "C:\Users\cesar\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\backends\utils.py", line 65, in execute 
return self.cursor.execute(sql, params) 
django.db.utils.ProgrammingError: no existe la relación «Pages_account» 

を私はスーパーユーザを追加しようとすると、それはPythonのmanage.py createsuperuser - 私と同じを持つのです。 。エラー

これは私のPages.models.pyです:

from django.conf import settings 
from django.db import models 
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser, PermissionsMixin 
) 


class AccountManager(BaseUserManager): 
    def create_user(self, email, id, first_name, last_name , password): 
     """ 
     Creates and saves a User with the given email, and other data 
     """ 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      email=self.normalize_email(email), 
      id=id, 
      first_name = first_name, 
      last_name = last_name, 
      password = password 
     ) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, id, first_name, last_name , password): 
     """ 
     Creates and saves a superuser with the given email, and other data 
     """ 
     user = self.create_user(
      email, 
      password=password, 
      id = id, 
      first_name = first_name, 
      last_name = last_name 
     ) 
     user.is_admin = True 
     user.save(using=self._db) 
     return user 


class Account(AbstractBaseUser,PermissionsMixin): 
    email = models.EmailField(
     verbose_name='email', 
     max_length=200, 
     primary_key=True 
    ) 
    id=models.BigIntegerField(unique=True) 
    sign_up_date = models.DateField(auto_now_add=True,) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 
    last_login = models.DateTimeField(auto_now=True) 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=150) 

    objects = AccountManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['id','first_name','last_name','password'] 

    def get_full_name(self): 
     # The user is identified by their email address 
     return self.first_name+self.last_name 

    def get_short_name(self): 
     # The user is identified by their email address 
     return self.first_name 

    def __str__(self):    # __unicode__ on Python 2 
     return self.email 

    def has_perm(self, perm, obj=None): 
     "Does the user have a specific permission?" 
     # Simplest possible answer: Yes, always 
     return True 

    def has_module_perms(self, app_label): 
     "Does the user have permissions to view the app `app_label`?" 
     # Simplest possible answer: Yes, always 
     return True 

    @property 
    def is_staff(self): 
     "Is the user a member of staff?" 
     # Simplest possible answer: All admins are staff 
     return self.is_admin 

#many to many Membership-Account and User generates Membership 
#Table which stores data 
class MembershipAccount(models.Model): 
    members = models.ManyToManyField(settings.AUTH_USER_MODEL,through='Membership') 

class Membership(models.Model): 
    payment_confirmed = models.BooleanField(default=False) 
    date_joined= models.DateField() 
    expired = models.BooleanField(default=False) 
    membershipaccounts_id = models.ForeignKey(MembershipAccount, on_delete=models.CASCADE) 
    accounts_id = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 

そして、これが私のadmin.py

from django import forms 
from django.contrib import admin 
from django.contrib.auth.models import Group 
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin 
from django.contrib.auth.forms import ReadOnlyPasswordHashField 
from .models import Account 


class UserCreationForm(forms.ModelForm): 
    """A form for creating new users. Includes all the required 
    fields, plus a repeated password.""" 
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput) 
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) 

    class Meta: 
     model = Account 
     fields = ('email', 'id','first_name','last_name','password') 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password2 

    def save(self, commit=True): 
     # Save the provided password in hashed format 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 


class UserChangeForm(forms.ModelForm): 
    """A form for updating users. Includes all the fields on 
    the user, but replaces the password field with admin's 
    password hash display field. 
    """ 
    password = ReadOnlyPasswordHashField() 

    class Meta: 
     model = Account 
     fields = ('email', 'password', 'id', 'first_name', 'last_name', 'is_active', 'is_admin') 

    def clean_password(self): 
     # Regardless of what the user provides, return the initial value. 
     # This is done here, rather than on the field, because the 
     # field does not have access to the initial value 
     return self.initial["password"] 


class UserAdmin(BaseUserAdmin): 
    # The forms to add and change user instances 
    form = UserChangeForm 
    add_form = UserCreationForm 

    # The fields to be used in displaying the User model. 
    # These override the definitions on the base UserAdmin 
    # that reference specific fields on auth.User. 
    list_display = ('email', 'id', 'is_admin') 
    list_filter = ('is_admin',) 
    fieldsets = (
     (None, {'fields': ('email', 'password')}), 
     ('Personal info', {'fields': ('id','first_name', 'last_name')}), 
     ('Permissions', {'fields': ('is_admin',)}), 
    ) 
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin 
    # overrides get_fieldsets to use this attribute when creating a user. 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('email', 'id', 'first_name', 'last_name', 'password1', 'password2')} 
     ), 
    ) 
    search_fields = ('email','id','first_name','last_name') 
    ordering = ('id',) 
    filter_horizontal =() 

# Now register the new UserAdmin... 
admin.site.register(Account, UserAdmin) 

最後ではなく、少なくとも、これは私のsetting.pyファイルです。

INSTALLED_APPS = [ 
    'Pages.apps.PagesConfig', 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
] 
some other code.. 
AUTH_USER_MODEL = 'Pages.Account' 
+0

こんにちは、私の最初のお勧めは大文字またはピリオドをモジュール(pythonファイル)の名前で使用しないことです。 Pythonでは可能ですが、多くのフレームワーク(特にDjango)がリフレクションを使用してモジュール名を解決するため、非常に悪いことです。 Pythonファイルはすべて小文字でなければならず、実際に何かを分ける必要がある場合は_を使用してください。クラス名にはキャメルケースを予約する必要があります。また、Djangoはあなたのappフォルダ内の 'models'というモジュールを探しますので、ファイルの名前を変更した場合は、新しいファイルを作成し、models.pyという名前を付けて、その中にすべてインポートします。 – fixmycode

+0

実際には名前はmodels.py CamelCaseの唯一の名前はapp Pagesです。 : –

+0

ページアプリケーションに '0001'と' 0002'マイグレーションを表示し、 'python manage showmigrations'の出力を表示してください。 – Alasdair

答えて

0

これはshowmigrationsの結果である:

Pages 
[X] 0001_initial 
[ ] 0002_auto_20170615_1214 
admin 
[X] 0001_initial 
[X] 0002_logentry_remove_auto_add 
auth 
[X] 0001_initial 
[X] 0002_alter_permission_name_max_length 
[X] 0003_alter_user_email_max_length 
[X] 0004_alter_user_username_opts 
[X] 0005_alter_user_last_login_null 
[X] 0006_require_contenttypes_0002 
[X] 0007_alter_validators_add_error_messages 
[X] 0008_alter_user_username_max_length 
contenttypes 
[X] 0001_initial 
[X] 0002_remove_content_type_name 
sessions 
[X] 0001_initial 

これは最初の移行(問題を解決しようとして依存関係を手動で追加の移行)

# -*- coding: utf-8 -*- 
# Generated by Django 1.11.2 on 2017-06-15 17:00 
from __future__ import unicode_literals 

from django.conf import settings 
from django.db import migrations, models 
import django.db.models.deletion 


class Migration(migrations.Migration): 

    initial = True 

    dependencies = [ 
     migrations.swappable_dependency(settings.AUTH_USER_MODEL), 
     ('auth', '0008_alter_user_username_max_length'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='Membership', 
      fields=[ 
       ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 
       ('payment_confirmed', models.BooleanField(default=False)), 
       ('date_joined', models.DateField()), 
       ('expired', models.BooleanField(default=False)), 
      ], 
     ), 
     migrations.CreateModel(
      name='MembershipAccount', 
      fields=[ 
       ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 
      ], 
     ), 
     migrations.CreateModel(
      name='Account', 
      fields=[ 
       ('password', models.CharField(max_length=128, verbose_name='password')), 
       ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), 
       ('email', models.EmailField(max_length=200, primary_key=True, serialize=False, verbose_name='email')), 
       ('id', models.BigIntegerField(unique=True)), 
       ('sign_up_date', models.DateField(auto_now_add=True)), 
       ('is_active', models.BooleanField(default=True)), 
       ('is_admin', models.BooleanField(default=False)), 
       ('last_login', models.DateTimeField(auto_now=True)), 
       ('first_name', models.CharField(max_length=100)), 
       ('last_name', models.CharField(max_length=100)), 
       ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), 
       ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), 
      ], 
      options={ 
       'abstract': False, 
      }, 
     ), 
     migrations.AddField(
      model_name='membershipaccount', 
      name='members', 
      field=models.ManyToManyField(through='Pages.Membership', to=settings.AUTH_USER_MODEL), 
     ), 
     migrations.AddField(
      model_name='membership', 
      name='accounts_id', 
      field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), 
     ), 
     migrations.AddField(
      model_name='membership', 
      name='membershipaccounts_id', 
      field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Pages.MembershipAccount'), 
     ), 
    ] 

であり、これは、第二の移行です。

# -*- coding: utf-8 -*- 
# Generated by Django 1.11.2 on 2017-06-15 17:14 
from __future__ import unicode_literals 

from django.db import migrations, models 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('Pages', '0001_initial'), 
    ] 

    operations = [ 
     migrations.AlterField(
      model_name='account', 
      name='last_name', 
      field=models.CharField(max_length=150), 
     ), 
    ] 
+0

問題に答えることができない場合は、このような回答を加えないでください。元の質問を編集してください。 – Alasdair

+0

私はこれをやった直後に考え出しました。 –

関連する問題

 関連する問題