2014-02-19 4 views
4

API를 만들기 위해 Django-rest-framework를 사용하고 있습니다. 내가 모델을 가지고 Chair 내가 viewset 건물입니다. 모델 TagManyToManyField이 있으므로 각 의자에 여러 개의 태그가 있습니다.Django rest framework에서`ManyToManyField` 변환하기

Tag은 장고 모델이지만 API와 상호 작용할 때 각 태그에 대한 JSON dict을보고 싶지 않습니다. 태그 이름 만 사용하고 싶습니다.

예. 각각에 대해 다음 나는 Chair을 만들 때

{ 
    'tags': ['meow', 'frrr', 'nutella'], 
    ... Any other chair attributes 
} 

과 마찬가지로, 나는 태그 이름의 목록을 전달 할 수 있도록하려면, 그리고 다음 API에 Chair을 볼 때, 나는이가보고 싶어 그들 중 그 이름으로 get_or_create을하십시오. (그래서 나는 그 이름으로 기존의 태그를 사용하거나 새로운 태그를 생성하고 있습니다.)

어떻게이 논리를 모든 serializer/viewset에 넣을 수 있습니까?

답변

2

이 같은 시리얼 라이저에 태그 필드를 정의 :

tags = serializers.SlugRelatedField(slug_field='name', many=True) 

는 이제 get_or_create 행동에 대한 나의 제안은 장고 양식을 사용하는 것입니다. post 메소드를 오버라이드 (또는 뷰 세트를 사용하는 경우 메소드 생성)하고 폼을 사용하여 물건을 생성하기위한 정상적인 장고 메소드를 작성해야한다.

보세요. 요청한 데이터입니다. 일반 파이썬 사전이므로 의자 양식의 데이터로 사용하십시오.

양식에서이 데이터를 수락하고 django 양식에서와 같이 데이터를 정상적으로 확인할 수 있습니다.

그런 다음 사용 의자 인스턴스를 만들 :

chair = form.save(commit=False) 
chair.save() 

당신은 지금 당신이 사용하는 많은 태그를 추가 할 수 있습니다와 의자 인스턴스가 있으면 : 파이썬 객체가 걸릴

chair.tags.add(tag1, tag2, tag3...) 

이 태그를 얻으려면을 요청에서 태그 이름 목록을 꺼내십시오 .DATA는 dict을 읽고 get_or_create 함수에 이름을 전달합니다. 다음과 같이 할 수 있습니다.

tags = [] 
tags_name_list = request.DATA['tags'] 
for tag_name in tags_name_list: 
    tag = Tag.objects.get_or_create(name=tag_name) 
    tags.append(tag) 

이제 태그 목록이 있습니다. 의자에 추가 :

chair.tags.add(*tags) 
관련 문제