2013-12-10 4 views
5

django 문서에 사용 된 모델에서 through 인수를 사용하여 중개자 역할을하는 모델을 가리키는 M2M 관계에 대해 살펴 보겠습니다.django-rest에서 M2M 관계를 사용하는 방법

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, 
            through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 

    class Meta: 
     ordering = ['date_joined'] 

내가 또한 date_joined 필드으로 정렬 각 그룹 내부의 모든 사람, 을 포함하는 그룹 모델의 읽기 - 쓰기보기 휴식을 갖고 싶어 이제 가정합니다.

class GroupSerializer(serializers.ModelSerializer): 
    members = serializers.SlugRelatedField(source='membership_set', 
              many=True, 
              read_only=False, 
              slug_field='person_id', 
              required=True) 

    class Meta: 
     model = Group 
     fields = ('id', 'name', 'members') 

동안 읽기 작업에 그것이 잘 작동합니다

{ 
    "id": 1, 
    "name": "U2", 
    "members": [ 
     20, 
     269, 
     134, 
     12, 
    ] 
} 

이 나는 ​​시리얼을 썼다 : 내가 얻을하고자하는 JSON 직렬화 (회원은 자신의 ID 만 설명) 다음과 같다 쓰기위한 것이 아닙니다. 위의 정의 직렬화 주어진, 그것은에 의해 진행됩니다, 그래서 나는 시리얼을 정의하는 방법 :

  1. 그룹 개체
  2. (멤버쉽 객체를 생성하여) 그룹의 각 구성원을 추가
만들기

답변

2

here에서 수행하려는 작업은 읽기 작업에서만 작동한다는 것을 알 수 있습니다. 이는 작성자 인 Tom Christie에 의해 언급 된대로 DRF에 대한 공통적 인 문제입니다 (this 설명).

또한 원하는 JSON 직렬화의 경우, here과 같이 PK 관련 필드를 사용하는 것이 좋지만 Group 객체 생성 및 멤버 추가에는 도움이되지 않습니다. 직접 코드를 작성해야합니다.

희망이 도움이됩니다. 생성 구성원에 의해 그룹에 각 사람을 추가

편집

코드는 :

def post_save(self, obj, created=False): 
    # obj represents the Group object 
    if created: 
     # Test to see if the Group was successfully created 
     members = self.request.DATA.get('members', None) 
     if members not None: 
      for id in members: 
       person = Person.objects.get(id=id) 
       membership, m_created = Membership.objects.get_or_create(person=person, group=obj) 
       # Here you can use m_created to see if the membership already existed and to do whatever else you need. 

이 구현은, 당신이 선언 한 것으로 가정하여 auto_now와 date_joined. 그렇지 않은 경우 매개 변수로 전달해야합니다.

+0

설명서의 관련 부분에 대한 링크 또는 저자의 답변에 대한 명확한 답변을 보내 주셔서 감사합니다. 내가하려는 일은 프레임 워크에서별로지지받지 않는 것이 유감입니다. 직접 코드를 작성하여 작업을 수행 할 수있는 방법을 제안 해 주시겠습니까? 올바른 방법은 무엇입니까? 다시 감사합니다! – Dragster

+0

제가 도와 드릴 수있어서 기쁩니다 :) 작성 부분에 대해서는 ** post/create ** 메소드 또는 ** post_save ** 메소드의 두 가지 위치에서 수행 할 수 있습니다. ** post_save **에서이 작업을 수행 할 것을 제안합니다. 그 이유는 프레임 워크가 Group 객체를 만들 수 있도록 허용하고 남아있는 작업 만 구성원을 추가하기 때문입니다. 이 방법을 사용하는 방법에 대한 작은 코드 스 니펫으로 내 대답을 편집합니다. – AdelaN

+0

정말 고마워, 당신의 지원은 매우 감사드립니다! – Dragster

관련 문제