인프런 커뮤니티 질문&답변

윤해빈님의 프로필 이미지

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

포스팅 목록 API를 구현하고 리액트에서 받아서 표현하기

db쪽에 자꾸 에러가 납니다

작성

·

755

·

수정됨

0

현재 MySQL을 사용해서 선생님 강의를 보며 모델을작성중인데 계속 이런 에러가 뜹니다.

 

django.db.utils.OperationalError: (1054, "Unknown column 'accounts_user.password' in 'field list'")

accounts/models.py

from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    pass

./ serializers.py

from rest_framework import serializers
from django.contrib.auth import get_user_model

User = get_user_model()

class SignupSerializer(serializers.ModelSerializer):
    #pw 보안
    password = serializers.CharField(write_only=True)

    def create(self, validated_data):
        user = User.objects.create(username=validated_data["username"])
        user.set_password(validated_data["password"]) #암호화된 비번 저장
        user.save()
        return user
    
    class Meta:
        model = User
        fields = ["pk", "username", "password"]

./views.py

from django.contrib.auth import get_user_model
from django.shortcuts import render
from rest_framework.permissions import AllowAny
from rest_framework.generics import CreateAPIView
from .serializers import SignupSerializer

#회원가입 뷰
#createapiview 이므로 get 메소드 허용X
class SignupView(CreateAPIView):
    model = get_user_model()
    serializer_class = SignupSerializer
    permission_classes = [
        AllowAny,#실제로 회원가입할 때는 로그인은 되면 안됨
    ]

 

그리고 accounts의 user를 참조하면서 라벨과 이미지를 첨부할 수있는 mainfunc의

./models.py

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User

class TImestampedModel(models.Model):
    # 기본 필드값
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Post(TImestampedModel):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    label = models.CharField(max_length=50, default='')
    images = models.ImageField(upload_to='images/%Y/%m/%d', blank=True)

    def __str__(self):
        return f'{self.author}'

./views.py
from rest_framework.viewsets import ModelViewSet
from .serializers import PostSerializer
from .models import Post
from rest_framework.permissions import AllowAny
from django.db.models import Q

# CRUD가 모두 들어간 API를 지원
class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    #permission_classes = [AllowAny] #FIXME: 인증 적용

    def get_queryset(self):
        qs = super().get_queryset()
        qs = qs.filter(
            Q(author=self.request.user) #본인이 작성한 글만 볼 수 있도록 함.
        )
        return qs

 

이렇습니다.
구글링해봐도 대부분은 그냥 migrations 된 파일을 삭제하고 다시 migrate 하니까 해결이 되던데 저는 계속 같은 에러가 뜨네요..혹시 뭐가 원인인지 알 수 있을까요?
AbstractUser 로 수정하고나서부터 이런 현상이 나타나긴 했습니다

일단 ERD는 아래와 같이 나옵니다.

답변 1

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

아래의 오류는 현재 장고 프로젝트가 바라보고 있는 데이터베이스에서 accounts 앱의 User 모델이 바라보는 테이블에서 password 컬럼이 없다는 오류입니다.

django.db.utils.OperationalError: (1054, "Unknown column 'accounts_user.password' in 'field list'")

ERD는 설계문서일 뿐, 현재의 데이터베이스 상황은 데이터베이스에 직접 접속해서 확인하셔야 합니다.
데이터베이스에 접속해서 accounts_user 테이블 내역을 꼭 확인해보세요.

데이터베이스를 삭제하시고 다시 migrate하셔도 동일한 오류가 발생하신다면,
accounts 앱의 마이그레이션 파일 중에 password 필드 생성과 관련된 마이그레이션이 누락이 된 것은 아닌가 싶습니다.

현재 accounts 앱의 마이그레이션 파일을 다른 경로에 백업해두시고,
accounts 앱에 대한 마이그레이션 파일 생성을 다시 해보시고, 서로 비교해보시는 건 어떨까요?

화이팅입니다. :-)

윤해빈님의 프로필 이미지
윤해빈
질문자

성격이 소심해서 db를 삭제하는걸 아예 고려를 안했는데 선생님 말씀보고 삭제하니까 충돌이 사라졌네요...models.py 구조를 여러번 바꾸면서 migrate 한게 원인이었나봅니다. 아예 싹 지우고 다시해보니 erd도 의도한대로 나오네요 감사합니다 ^^