2011-11-08 4 views
1

나는 장고를 처음 사용하여 PHP에서 Propel ORM 엔진으로 옮겼습니다. 그래서 내가 장고에서 현재하고있는 일이 여기있다. 내 웹 사이트Django에서 모델 "Behaviors"

  1. 도서, 그들 각각의 될 수 있습니다
  2. 제작사,
  3. 코멘트,
  4. 제 등 (이 시점이 아니다)

같은 몇 가지 모델이있다 한 번만 사용자가 좋아하거나 싫어하면 모델의 등급이 +1 또는 -1로 변경됩니다.

PHP의 관점에서 전 동작을 생성합니다. 원본 모델 및 쿼리 클래스 (예 : get_rating(), order_by_rating() 등)에 일부 필드와 메서드를 추가하고 이전 모델의 각 모델에 대해 별도의 테이블을 만드는 "평가 대상". book_rating_history은 각 객체에 대한 모든 등급을 보유하고 사용자가 등급을 변경할 수 있는지 또는 변경할 수 없는지 (필요한 경우 모든 객체의 등급 표시) 결정합니다. 그래서 내가해야 할 일은 모델 선언에서 "평가 대상"행동을 지정하는 것뿐입니다. 다른 모든 것은 자동으로 수행됩니다.

질문은 - 장고에서 이것을 해결하는 방법은 무엇입니까? 모델을 올바르게 작성하는 방법? 비슷한 경우에 어떤 기법을 사용합니까?

답변

3

평점과 책을 별도로 저장해야합니다 (테스트되지 않은 상태).

from django.contrib.auth.models import User 
from django.db import models 
from django.db.models import Sum 

class BookRating(models.Model): 
    user = models.ForeignKey(User) 
    book = models.ForeignKey('Book') 

    # you'll want to enforce that this is only ever +1 or -1 
    rating = models.IntegerField() 

    class Meta: 
    unique_together = (('user', 'book'),) 

class Book(models.Model): 
    title = models.CharField(max_length = 50) 

    def rating(self): 
    return BookRating.objects.filter(book = self).aggregate(Sum('rating')) 

unique_together 각 사용자는 지정된 책을 한 번만 평가할 수 있습니다. 나는 그것을 테스트하지 않았했지만, 희망이 당신이 시작하는 데 충분하다 -이 문제가있는 경우에 코멘트를 추가

book = Book.objects.get(pk = 1) 
rating = book.rating() 

:

당신은 다음과 같은이 뭔가를 사용할 수 있습니다.

원할 경우 content types을 사용하여 별도의 등급 객체가있는 각 객체 (서적, 출판사, 댓글, 기사)를 피할 수 있습니다.

또는 django-likes 또는 phileo과 같은 좋아하는 것을 처리하는 기존 재사용 가능한 앱을 살펴볼 수도 있습니다.

+1

보너스 기능으로 평가 데이터 마녀 콘텐츠 형식을 저장하기위한 하나의 모델을 사용하는 것이 좋습니다. –

0

추상적 인 모델에서만 특별한 방법 (예 : 투표, get_rating 등)을 정의한 다음이 모델을 사용하여 "평가 대상"모델을 만들 수 있습니다. 사용자가 나중에 자신의 등급을 변경할 수 있습니다

class Rateable(models.Model): 

    class Meta: 
     abstract = True 

    def vote(self, *args, **kwargs): 
     ... 

    def rating(self, *args, **kwargs): 
     ... 

class Book(Rateable): 
    ... 

은 또한 발견 도미닉 로저

+0

감사합니다. 콘텐츠 형식 프레임 워크에 대한 설명서를 읽었으며 등급, 태그 및 이와 유사한 용도로 사용하기로 결정했습니다. – user655136

관련 문제