2013-10-25 87 views
0

我有一个模型可以说客户。我想给该客户添加一个字段让我们说next_meeting。它将是一个日期时间字段,并且将具有与客户下次会议的日期。我也有一个会议模型,它有一个类型为datetimeField的日期字段。所以他们看起来像那样。由另一个模型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

当你设计你的数据库结构时,你应该确保你不会在多个地方重复相同的信息 - 也就是说,数据库在规范化。摆脱next_meeting场都在一起,你仍然可以得到正确的查询的信息:

获取客户最近一次会议ID为customer_id

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

加入最近的会议日期,以每个用户在查询集:

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

这假设有在数据库中没有过去的会议 - 因为你的解决方案也需要是这种情况。如果不是,你显然需要再过滤一次,过滤掉会议。

+0

非常感谢。所以它不需要存储在数据库中。但是,如果用户比会议更新更频繁地检查客户页面会怎么样。这不是查询(你写的会议)比存储在数据库中更昂贵吗? – Apostolos

+1

你应该设计你的数据库进行规范化处理,然后有选择性地使用或者缓存它(或者说“如果”!)你遇到了真实的性能问题。当那一天到来时,有多个缓存/非规范化的第三方包,如缓存机,johny缓存和django-denorm。 –

+0

注释不会添加字段权限?只要查询存在,只创建一个?类似的东西? – Apostolos

相关问题