Skip to main content

Command Palette

Search for a command to run...

게시글 등록시 pk값이 아닌 username으로 값을 넣고 싶다!

Published
•2 min read•View as Markdown
게시글 등록시 pk값이 아닌 username으로 값을 넣고 싶다!

게시글 등록을 할 때 user를 pk가 아닌 username으로 오게 하고 싶어서 serializer의 method field를 사용해보기로 했다.

SerializerMethodField

읽기 전용 필드로 연결된 serilaizer 클래스에서 메서드를 호출하여 값을 가져온다.
SerializerMethodField(method_name=None)


serializer.py

from rest_framework import serializers
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()

    class Meta:
        model = Product
        fields = '__all__'

    def get_user(self, obj):
        return obj.user.username

return obj.user.username을 할 때 해당 username을 pk로 하나 더 둘까 고민하다가

models.py의 user에 related_name='username' 로 추가하고 사용할까 하다가

related로 이름을 추가해 보았다.

models.py

from django.db import models
from accounts.models import User


class Product(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='username')
    title = models.CharField(max_length=120)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    # image = models.ImageField()

    def __str__(self):
        return str(self.title)

related로 이름을 추가하고 postman에서 데이터를 보내면

TypeError: Direct assignment to the reverse side of a related set is prohibited. Use username.set() instead. 에러가 나온다.


models.py 에서 user에 related_name 추가

user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='product_set')

결국 related_name을 받아오는건 상관없었다.


데이터를 넘겨줄 때 username으로 주더라도 결국 db에는 user pk로 넘겨줘야 하고,

username으로 넘어가게 할 때

1. initial data의 형태를 바꾼다. - 유저네임을 넘겨줬지만이니셜 데이터는 유저 아이디를 넣는것으로 한다.

2. create를 새로 정의해서 나만의 저장로직을 만든다. 방법이 있다.

이렇게 두가지 방법이 있다.


첫번째 방법을 사용해서 시리얼라이저 안쪽에서 사용하는 값을 커스텀하는데,

id값으로 가져오기 싫어서 요청할 때는 username으로 요청하고 시리얼라이저로 처리할 때는

최초의 데이터를 필요한 값(원래 장고에서 처리할 때)으로 수정해서 사용한다.

def to_internal_value(self, data):

        internal_values = data
        username = internal_values.get('user')

        user = get_user_model().objects.get(username=username)
        internal_values['user'] = user

        return internal_values
P
Park2y ago

고생하였읍니다

More from this blog

s3사용 및 s3:PutBucketPolicy 권한 오류

1. S3 생성 중 정책 생성 페이지에서 s3:PutBucketPolicy 권한이 없어 오류 발생 IAM 사용이 아닌 루트 사용자 버전으로 설명 AWS IAM 콘솔 → 정책 → AdministratorAccess⁠검색→ 정책이 나타나면 사용자에 연결→ 없다면 새로운 정책 추가 없으므로 AdministratorAccess 생성 정책 생성 버튼 클릭 → JSON 탭 선택 후 아래 코드 입력 → 생성 { "Version": "2012-10-1...

Mar 12, 20252 min read9
s3사용 및 s3:PutBucketPolicy 권한 오류

챗봇과 사용자의 대화 내용이 길어질수록 llm 호출 시 토큰 수가 증가하여 응답 시간이 지연되는 문제가 발생

https://youtu.be/5soSQgVHGEA OpenAI API를 이용한 챗봇을 만들면서 대화가 길어질수록 LLM 호출 시 토큰 수 증가로 응답 시간이길어지는 문제가 발생 문제분석 여기서 생각하는 문제는 db 조회의 부하 처음 챗봇에게 부여하는 역할이 너무 긴데, 이걸 매 API 호출마다 전송함 대화 흐름을 기억하기 위해 챗봇-유저 간 대화 내용을 모두 DB에 저장한 다음 그대로 API 호출 마다 LLM에 전달함 → 모든 대화 ...

Jan 16, 20253 min read122
챗봇과 사용자의 대화 내용이 길어질수록 llm 호출 시 토큰 수가 증가하여 응답 시간이 지연되는 문제가 발생

dayeon's blog

124 posts