2013-10-25 2 views
0

나는 고객을 말할 수있는 모델이 있습니다. 그리고 그 고객에게 next_meeting을 말할 수있는 필드를 추가하고 싶습니다. datetime 필드이며 고객과의 다음 회의 날짜를 갖습니다. 또한 datetimeField 유형의 날짜 필드가있는 Meeting 모델이 있습니다. 그래서 그들은 그런 모습을 보입니다.다른 모델에 의해 upadated 모델의 필드 django

class Customer(models.Model): 
    ....fields.... 
    next_meeting = models.DateTimeField(blank=True, null=True) 


class Meeting(models.Model): 
    ....fields.... 
    date = models.DateTimeField(auto_now_add = True) 
    customer = models.ForeignKey(Customer, related_name='meetings') 

customer.next_meeting 필드에 다음 회의의 가장 최근 날짜가 포함되기를 원합니다. 그래서 회의의 날짜를 취할 것 신호 저장 후 일을 생각하고, (회의가 삭제 된 경우)

1. Check if customer.next_meeting is null (first meeting). If null set next_meeting to meeting.date 
2. If not null check if meeting.date < customer.next_meeting. If true update customer.next_meeting 

동일 게시물 삭제 신호를 수행해야합니다.

1. get the most recent meeting after current date for customer using order_by('date')[0] 
2. If meeting: update the next_meeting field, else(no meetings) leave blank. 

올바른 방법입니다. 고객 데이터베이스 측면에서 많은 회의가있는 경우에는 너무 비싸다. 또는 나는 틀린가?

답변

1

데이터베이스 구조를 디자인 할 때 여러 위치에서 동일한 정보를 반복하지 않아야합니다. 즉, 데이터베이스가 정규화되어 있어야합니다.

Meeting.objects.filter(customer=customer_id).order_by('date').first() 

은 모든 사용자에게 가장 최근의 회의 날짜 추가 : ID customer_id와 고객에 대한 가장 최근의 회의를 받기

: 모두 함께 next_meeting 필드를 제거, 당신은 여전히 ​​올바른 쿼리 정보를 얻을 수 있습니다 쿼리 세트에서 :

Customer.objects.annotate(next_meeting=Min('meeting__date')) 

이것은 데이터베이스에서 지난 모임이 없다고 가정합니다. 해결책이 필요하기도합니다. 그렇지 않은 경우 과거에 미팅을 필터링하는 데 필터가 한 번 더 더 필요할 것입니다.

+0

오, 아주 많이. 따라서 db에 저장할 필요가 없습니다. 그러나 사용자가 회의가 업데이트되는 것보다 더 자주 고객 페이지를 확인하면 어떨까요? 쿼리 (당신이 쓴 모임)가 DB에 저장하는 것보다 비용이 많이 듭니까? – Apostolos

+1

DB를 정규화하도록 설계하고 실제 성능 문제가 발생했을 때 선택적으로 사기성을 없애거나 캐싱해야합니다 (또는 "if"!). 그 날이 오면 캐시 머신, johny 캐시 및 장고 - denorm과 같은 캐싱/역 정규화를위한 제 3 자 패키지가 여러 개 있습니다. –

+0

주석은 필드를 추가하지 않습니다. 쿼리가 존재하는 동안 만 생성하십시오. – Apostolos

관련 문제