KyleXID

몬스터코딩

ManyToMany테이블 value 추출,query to json, list of dictionaty

2019-05-06 KyleXIDTIL

ManyToMany테이블에서 value값에 접근하는 방법

프로젝트를 하면서 ManyToMany테이블에 value값을 추출해야 하는 경우가 발생했다. ManyToMany는 Clothes라는 모델에 종속되어 있고, User모델과 연결되어 있었다.
필요한 항목은 front에서 받은 유저정보로 접근하여 해당유저가 heart를 누른 이미지 리스트이다.

먼저 ManyToMany테이블은 다음과 같이 이루어져있다.

+----------+---------+------+-----+---------+----------------+
| Field    | Type    | Null | Key | Default | Extra          |
+----------+---------+------+-----+---------+----------------+
| id       | int(11) | NO   | PRI | NULL    | auto_increment |
| cloth_id | int(11) | NO   | MUL | NULL    |                |
| user_id  | int(11) | NO   | MUL | NULL    |                |
+----------+---------+------+-----+---------+----------------+

검색을 통해 알게 된 M2M 테이블 접근방법은 filter 또는 values를 사용하여 __ (double underscore)를 통해 접근하는 방법이다.

나의 경우는 Cloth에 종속된 heart M2M테이블이기 때문에 아래와 같이 접근했다.

hearts_list = Cloth.objects.filter(hearts__id=user.id)

이렇게 접근하면 해당 유저아이디를 갖고있는 M2M의 값들이 hearts_list에 저장된다.

hearts__ 다음에 사용할 수 있는 값들은 연결된 User의 Field이다.

여기서 Cloth의 Field의 값에 따라 데이터를 받아오고싶다면. 다음과 같이 입력하면 된다.

Cloth.objects.all().values('hearts__id').values('pk')
여기서 pk는 Cloth의 pk이다.

위와 같이 값을 빼올 경우 값은 Queryset 형태로 오기때문에 JsonResponse로 보내주기 위해서는 json형태로 이를 변환시켜주어야한다.

1. django의 serializers를 통한 형태 변환

장고 내부의 serializers를 이용하면 형태를 변환시킬 수 있다.

from django.core import serializers
		.
		.
		.
	return JsonResponse({'hearts_list' : json.loads(serializers.serialize('json', hearts_list))})

다음과 같이 return해주면 정상적으로 JsonResponse로 반환이 가능하다.

2. list를 통한 형태 변환

간단한 방법으로 장고 내부의 list()를 써주면 바로 list형태로 변환이 된다.

M2M에서 추출한 데이터 정리하기

나의 경우에는 M2M에서 추출한 데이터를 list()를 통해 변환해도 내가 생각한 Key의 이름과는 많이 달랐다.
그래서 다시 추출한 데이터를 새로운 키의값에 배정시키는 작업을 진행하였다. 추가적으로 필요한 다른 정보도 넣어주었다.

[
    {'img_id' : d['pk'],
     'img_ref' : d['img_ref'],
     'total_hearts' : Cloth.objects.get(id = d['pk']).total_hearts} for d in hearts_list
]

다음과 같은 for문을 통하여 추출한 데이터를 내가 원하는 Key값으로 정리하였다.

Before

[
    {'pk': 1, 'img_ref': 'www'},
    {'pk': 2, 'img_ref': 'www2'},
    {'pk': 3, 'img_ref': 'www3'},
    {'pk': 4, 'img_ref': 'www4'}
]

After

[
    {
        "img_id": 4,
        "img_ref": "www4",
        "total_hearts": 1
    },
    {
        "img_id": 3,
        "img_ref": "www3",
        "total_hearts": 3
    },
    {
        "img_id": 2,
        "img_ref": "www2",
        "total_hearts": 3
    },
    {
        "img_id": 1,
        "img_ref": "www",
        "total_hearts": 4
    }
]