• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

관계 표현 모델 필드에 관한 질문

21.10.27 13:41 작성 조회수 118

1

1:1관계인데 upload를 통해 값이 바뀌고 수정되는 경우도 1:1 관계로 정의 하면 될까요?

리더보드에서 json파일로 답을 업로드 하고 그에 따라 점수나 순위가 바뀌는데 계속해서 답을 제출할 수 있는 경우입니다.

답변 3

·

답변을 작성해보세요.

0

박재완님의 프로필

박재완

질문자

2021.11.03

안녕하세요. 저번에 말씀해주신것들 제 생각대로 이해했다가 틀린것 같아서 질문드립니다.

제가 아래와 같이 간단한 코드를 짰습니다.(accuracy_score.py)

정답이 있는 json파일을 통해서 예를 들어

정답 : {"aid": 3, "qid": 3 } ,{"aid": 2, "qid": 4 } ,{"aid": 1, "qid": 5 } 

답변 : {"aid": 1, "qid": 3 } ,{"aid": 2, "qid": 4 } ,{"aid": 1, "qid": 5 } 

이렇게 위 아래 대조하면 두개를 맞춰서 2점이 나온다.  그럼 이 2점을  score에 넣고 id , rank 등 여러 데이터와 합쳐 db에 넣고 활용해서 이용하는 프로그램을 만들고 있습니다.

 제가 강사님의 답변을 들었을때 accuracy_score.py를 짜고 serializers.py에 어떻게든 넣으면 되겠지 라고 생각해서 아래와 같이 쓰고 model에 score = models.CharField() 로 dummy파일 몇개 올려서 test 해보았는데 실패했습니다. 

확실하진 않지만 FileField를 이용해서 serializers.py 나 form.py에서 계산이 들어가는것 같은데 맞는 방법인지 궁금하고 혹시 가능하시다면 간단히 보여주실수 있는지 궁금합니다.(다른부분은 괜찮은데 계산이 데이터를 계산하는 부분만 알려주실수 있을까요 ㅠㅠ)

제가 시작한지도 얼마 안돼서 지식이 부족한데 프로젝트 기간이 얼마 안남아서 염치없이 문의를 남깁니다.  

읽어주셔서 감사합니다.

# accuracy_score.py 
 
import json
from sklearn.metrics import accuracy_score
from glob import glob


sample = sorted(glob("/Users/jaewanpark/django-with-react-rev5/backend/leaderboard/submit/*.json"))

class score_ev:
 
def answer_sheet():
fname_a = '/Users/jaewanpark/django-with-react-rev5/backend/leaderboard/answer/our_answers.json'
 
with open(fname_a , 'r', encoding='utf-8-sig') as f:
json_data = json.load(f)
answer = []
for i in json_data:
answer.append(i['correct_idx'])
return answer
answer = answer_sheet()

fname = '/Users/jaewanpark/django-with-react-rev5/backend/leaderboard/submit/submit1.json'
with open(fname , 'r', encoding='utf-8-sig') as f:
json_data = json.load(f)

def submit_sheet(json_data):
submit = []
for i in json_data:
submit.append(i['correct_idx'])
return submit
submit = submit_sheet(json_data)

def convert_to_score(submit, answer):
accuracy_score(submit, answer)
score = accuracy_score(submit, answer, normalize=False)
return score
score = convert_to_score(submit, answer)
 
 

 

# serializers.py


class PutSerializer(serializers.ModelSerializer):
score = serializers.SerializerMethodField()
ev = score_ev
def get_score(self,ev):
return ev.score

class Meta:
model = Put
fields = [
'pk',
'user',
'score',
'rank',
'round',
'submit',
]

코드에 들여쓰기가 적용되어 있지 않아서 코드를 제대로 보기가 힘들기도 하구요. 위 코드만 봐서는 코드의 의도를 잘 모르겠습니다. score_ev 의 역할도 잘 모르겠습니다. :-(

박재완님의 프로필

박재완

질문자

2021.11.04

serializers.py 부분의 코드는 틀린 부분이라 제대로 보지 않으셔도 될 것 같습니다. ㅠㅠ 

제 질문의 핵심을 간단하게 요약하자면

1. accuracy_score.py ( 정답인 json 파일이 있어서 제출되는 json 파일과 비교해 점수를 내는 코드 )를 이용하여 사용자가 json 파일을 업로드하는 순간 점수로 바뀌면서 DB에 저장되는 방법을 알고 싶습니다.

2. 위와 같이 하기 위해서 models.py 에는 FileField 를 이용하고 serializers.py 부분을 변경하는게 맞는지 맞다면 어떤식으로 accuracy_score.py 를 이용하는지

3. 틀렸다면 어떤 부분이 틀렸는지 알려주세요!!

 

코드를 짜주실 필요도 없고, 디테일하게 알려주실 필요도 없습니다.

대략적으로 감을 잡을 수 있게 형태 정도만 알려주시면 구글링으로 나머지는 해결하겠습니다!!

파이썬, 장고, 프로그래밍 다 입문이라 제 질문이 조금 이상하다고 느껴지실 수 있는데 질문이

이상하다고 느껴지신다면 거기에 대한 피드백 주세요!!!

좋은 하루 되세요! 감사합니다.

입력값에 대한 유효성 검사가 아니라, 단순히 모델을 저장(save)시에 A필드값을 참조하여 B필드값에 반영코자 하는 것이라면, Serializer가 아니라 Model 에서 save 멤버함수를 오버라이딩하시거나 post_save 시그널을 활용해보세요.

0

박재완님의 프로필

박재완

질문자

2021.10.27

답변 감사드립니다 :)

다른 질문 하나만 더 드려도 될까요?

어떤 챌린지에서 참가자들의 파일(json포맷)들을 업로드 받고 그 파일들을 평가하여 점수를 DB에 저장하려고 하는데 

이 때 평가하는 부분의 처리는 views.py 에서 하면 되는건가요???

 

말씀하신 평가가 입력된 값에 대한 유효성 검사 (validate)라 하시면, 관련 장고 Form이나 Serializer에서 수행하시는 것이 맞습니다.

장고의 View는 최대한 Thin하게 가져가시는 것이 장고의 철학입니다. (Thin View, Fat Model/Form, Stupid Template)

장고를 잘 이해하지 못하고 개발하면, 뷰에 모든 로직들을 구현하게 되고, 불필요한 반복이 발생하게 됩니다.

박재완님의 프로필

박재완

질문자

2021.10.28

답변 감사합니다:) 

아직 모르는게 많아서 궁금한게 있으면 또 질문드리겠습니다.

0

어떤 필드의 값이 바뀌고 수정되는 것과 모델 간의 Relation은 관련이 없습니다. 테이블의 어떤 필드이든 값은 계속 변경될 수 있습니다. 그러니 값 수정과는 별개로 Relation을 설계하시면 되실 듯 합니다.

그리고 업로드되시는 파일이 JSON 포맷이시라면, DB에 저장하실 수도 있습니다. 최근의 DB들은 JSON타입을 지원하구요. 장고도 이에 맞춰 3.1부터 models.JSONField를 지원하고 있습니다.
https://docs.djangoproject.com/ko/3.2/ref/models/fields/#jsonfield