Django에서 WebSocket을 이용해 채팅 서버를 구현하는 도중 '차단' 기능을 구현하기 위해 field 설정에서 문제가 생겼다.
차단한 상대방이 알 수 없도록 차단 목록을 추가하는 것이다.
django field에는 기본적으로 배열로 데이터를 저장하는 법은 없다.
from django.db import models
from django.contrib.postgres.fields import ArrayField
class MyModel(models.Model):
my_list_field = ArrayField(models.CharField(max_length=255))
postgresql에서만 지원하는 기능은 있다. 하지만 ArrayField에는 Foreign key는 설정할 수 없다고 한다. 단일 값만 참조할 수 있다고 한다.
그래서 ManyToManyField를 통해 다대다 관계를 이용했다.
blocked_users = models.ManyToManyField('self')
자기 자신을 foreign key로 지정하는 법이다. 하지만 해당 방법을 사용하면

기본적으로 양방향 관계로 서로 상대의 정보를 저장해 놓는다. 차단한 상대가 몰랐으면 하는 요구사항에 적합하지 않다.
blocked_users = models.ManyToManyField('self', symmetrical=False)
symmetrical 옵션을 꺼놓으면 단방향으로만 저장이 된다.