작성
·
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도 의도한대로 나오네요 감사합니다 ^^