2014-05-19 5 views
1

내 Django 프로젝트에는 기본적으로 많은 항목을 저장하는 Item이라는 모델이 있습니다. 또한 사용자가 등록하고 로그인 할 수 있도록 Django에 내장 된 사용자 모델을 사용합니다. 지금 내가 원하는 것은 각 사용자가 항목을 "수집 됨"으로 확인할 수 있도록하는 것입니다.
지금 당장 해결 한 방식이 편안하지 않기 때문에 이것이이 문제에 대한 우수 사례인지 묻는 것입니다. 아니면 내 문제를 해결하기위한 모범 사례가 있습니까?

이 지금 내 솔루션입니다 :ManyToMany 관계에있는 항목에 사용자를 연결하는 가장 좋은 방법은 무엇입니까?

from django.contrib.auth.models import User 

class Item(models.Model): 
    ... 
    users_collected = models.ManyToManyField(User, related_name='items_collected') 

내가로 사용 : 사용자와 항목 사이의 기록이있는 경우 해당 사용자에 의해 수집로, 다음 항목이 고려된다. 항목을 수집 한 것으로 표시하려면 단순히 레코드를 추가하고 다시 수집하지 않도록 표시하려면 해당 레코드를 제거하십시오.

특정 항목 범주에 대한 세부 템플릿에서 사용자에게 수집 된 항목이 있는지 여부를 표시하는 다음 코드가 있습니다. 사용자가 정기적으로 확인하고 항목을 선택 취소합니다으로 문제를 해결하기 위해이 방법을 사용하여

{% for item in items %} 
    {{ item.name }} - 
    {% if user in item.users_collected.all %} 
     in collection. 
    {% else %} 
     not in collection. 
    {% endif %} 

내 주요 관심사는, 생성 된 ManyToMany - 테이블 생성 및 삭제 레코드의 수입니다. Item의 모델에 새로운 필드를 두는 것을 좋아하지 않는다. 재사용 성이 떨어지는 것 같아?

+0

확대 할 수 있습니까? * 항목 모델에 새 필드를 추가하고 싶지 않습니다. *? 어떤 분야를 의미합니까? 이미 알고 있다고 생각하지만'users_collected'는'Item' 테이블의 실제 필드가 아닙니다. –

+0

예, 내가 추천하는 사용자가 수집 한 것입니다. Django는 항목과 사용자에 대한 참조를 저장하는 새 테이블을 만든 다음이 테이블과 항목 및 사용자의 테이블에 관계를 만듭니 까? –

+0

네, 그렇습니다. 'users_collected'는 Django가 만든 모델 * 인스턴스 *의 * 속성 *이 될 것입니다. 데이터베이스 * 테이블 * 필드 *되지 않습니다. –

답변

0

예, 이것이 우수 사례라고 생각합니다. UsersItems 사이의 관계를 지속적으로 저장해야하며 가능한 가장 간단한 방법으로 방법을 수행해야합니다.

높은 데이터베이스 쓰기 속도는 확실히 문제가 될 수 있지만이 정보를 저장하는 방법은 무엇입니까? 예를 들어, 각각 User은 수집 여부를 나타내는 Item 당 1 비트의 비트 배열 필드를 갖는 좀 더 이색적인 구현을 상상할 수 있습니다. 그러나 당신이 그런 식으로 일하는 데 대한 좋은 이유가 없다면 나는이 간단한 방법으로 시작할 것입니다.

내가 갖고있는 조언 중 하나는 M2M through 테이블 (documentation 참조)을 명시 적으로 작성하는 것입니다. 이렇게하면 명확성이 향상되고 관계가 복잡해지면서 추가 필드를 쉽게 추가 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그런 식으로 말할 때, 구현하기 쉬운 다른 방법으로는 어렵다고 생각합니다. 나는 M2M도 살펴볼 것이다. –

관련 문제