由另一个模型django upadated的模型的领域

时间:2013-10-25 08:41:35

标签: django signals models

我有一个模型可以说客户。我想为该客户添加一个字段,让我们说next_meeting。它将是一个日期时间字段,并将具有与客户的下一次会议的日期。我还有一个会议模型,其日期字段的类型为datetimeField。所以他们看起来像那样。

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 个答案:

答案 0 :(得分:1)

设计数据库结构时,应确保不要在多个位置重复相同的信息 - 即数据库处于规范化状态。一起摆脱next_meeting字段,您仍然可以使用正确的查询获取信息:

为身份customer_id

的客户获取最近的会议
Meeting.objects.filter(customer=customer_id).order_by('date').first()

将最近的会议日期添加到查询集中的每个用户:

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

这假设数据库中没有过去的会议 - 因为您的解决方案也需要这样的情况。如果不是,你显然需要一个过滤器,以过去过滤会议。