N:M recursive 관계

the class to which the model is related, which works exactly the same as it does for ForeignKey, including recursive and lazy relationships.
  • 하나의 모델 안에서 ManyToManyField 사용
    class Person(models.Model):
      friends = models.ManyToManyField("self")
    
  • symmetrical=True 속성
    ManyToManyFields on self 에서만 사용 가능(default True)
    Person 모델에 person_set 속성을 추가 안하고 symmetrical 필드로 여겨짐
    intermediary 모델에서도 가능
    
  • Through 모델 : 연관을 위해 DB 테이블로 암시적으로 생성됨
  • Through 모델을 통한 필드는 시리얼라이저에서 Read-only 필드 ``` class Person(models.Model): name = models.CharField(max_length=50)

class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField( Person, ################### 여기 #################### through=’Membership’, through_fields=(‘group’, ‘person’), ########################################### )

class Membership(models.Model): group = models.ForeignKey(Group, on_delete=models.CASCADE) person = models.ForeignKey(Person, on_delete=models.CASCADE) inviter = models.ForeignKey( Person, on_delete=models.CASCADE, related_name=”membership_invites”, ) invite_reason = models.CharField(max_length=64)


# 1:N recursive 관계
- 하나의 모델 안에서 foreignkey 사용하는 방법

models.ForeignKey(‘self’, on_delete=models.CASCADE)


# reverse-관계
- 모델시리얼라이저, 하이퍼링크 모델시리얼라이저에 자동포함 안됨
- 모델 클래스에서 related_name 지정해야

class Track(models.Model): album = models.ForeignKey(Album, related_name=’tracks’,

- 시리얼라이저 필드에서 Meta의 필드명으로서 related_name 값으로 지정

class AlbumSerializer(serializers.ModelSerializer): class Meta: fields = [‘tracks’, …]

- 쿼리를 위해 쿼리셋.filter() 써야

// OR 조건 Blog.objects.filter( entry__headline__contains=’Lennon’ ).filter( entry__pub_date__year=2008 )

- 문맥이 살짝 다름 : 두 조건 Lenon AND 2008 을 모두 만족시키는 객체

// AND 조건 Blog.objects.filter( entry__headline__contains=’Lennon’, entry__pub_date__year=2008 ) ```