django

django serializer로 foreign key 관계의 원하는 값들을 가져오는 방법

발전생 2020. 12. 29. 11:34

post를 비동기 방식으로 json 객체로 받아오기 때문에 author의 user name이랑 author의 프로필 사진을 같이 받아올 필요성이 있었다. serializer의 기본 설정을 사용한다면 foreign key 관계인 author는 id만 가져온다. 그러나 아래처럼 natural_key를 설정해주면 특정 필드 값들을 원하는 만큼 tuple로 리턴해줄 수 있다. rest framework 없이도 가능하다.

 

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    pic = models.ImageField(default="profile-default.svg")
    friend = models.ManyToManyField('self', blank=True)
    group = models.ManyToManyField(Group, blank=True)

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

    def natural_key(self):
        return (str(self.user), self.pic.url)

class Post(models.Model):
    content = models.TextField()
    created_date = models.DateTimeField(auto_now_add=True)
    likes = models.PositiveIntegerField(default=0)
    liked = models.ManyToManyField(Profile, blank=True, related_name='liked')
    author = models.ForeignKey(Profile, null=True, on_delete=models.CASCADE)

    class Meta:
        ordering = ['-created_date']

 

그리고 serializer에 키워드 매개변수로 use_natural_foreign_key=True 를 사용해줘야 한다.

data = serializers.serialize('json', Post.objects.all()[from_pk:from_pk+10],\
                                 use_natural_foreign_keys=True)

 

이제 json 객체에 user name, pic.url이 같이 실려 보내진다.