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

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

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




