[Django/DRF - 관계 생성하기]

SooYeon Yeon·2022년 7월 2일
0

Django

목록 보기
19/20

유저와 상품 관계 맺기

상품이 다 측. 한 사람이 여러개의 상품 담을 수 있다. 1대다

product 모델에 seller 추가

from django.db import models

# Create your models here.
from rest_framework.authtoken.admin import User

class Product(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    price = models.IntegerField()
    created_at = models.DateTimeField(auto_now_add=True)
    seller = models.ForeignKey(User, on_delete=models.CASCADE)

seller는 로그인 한 사용자가 되도록 해야함

form이랑 비슷한게 serializer였고,

serializer 변경

from rest_framework import serializers

from product.models import Product

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['name','description','price',]

product views.py에 함수 추가

# 로그인 한 사용자만 게시글 저장(로그인한 사용자 정보로만 저장되게)
    def create(self,request):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save(seller=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

해서 로그인하고 POST로 등록할 수 있으면 됨. DB확인해서 sellerid가 로그인한사람의 id면 됨

사용자와 리뷰 관계

리뷰에 사용자 달기

  • Review 모델에 writer 추가
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
# Create your models here.
from rest_framework.authtoken.admin import User

class Review(models.Model):
    score = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(5)]) # 0최소값, 5최대값으로 설정해 리뷰 0~5점까지 받도록
    contents = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    writer = models.ForeignKey(User, on_delete=models.CASCADE)
  • serializer 변경
from rest_framework import serializers

from review.models import Review

class ReviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Review
        fields = ['score','contents',] # writer는 빼고
  • post views를 다음과 같이 변경 (post 메소드)
class ReviewList(APIView):
    ...

    def post(self,request):
        serializer = ReviewSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(writer=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# 로그인 한 사용자만 게시글 저장(로그인한 사용자 정보로만 저장되게)
    def create(self,request):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save(seller=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

이렇게 고쳐도 됨

def perform_create(self, serializer):
        serializer.save(user=self.request.user)

0개의 댓글