0

我有一个模型,可以说是客户。我想为该客户添加一个字段让我们说 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.

这是正确的方法吗?如果您有很多会议为客户数据库方面昂贵,这听起来有点太“昂贵”。还是我弄错了?

4

1 回答 1

1

当你设计你的数据库结构时,你应该确保你不会在多个地方重复相同的信息——即数据库是标准化的。把字段全部去掉next_meeting,你仍然可以通过正确的查询获得信息:

获取具有 id 的客户的最新会议customer_id

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

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

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

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

于 2013-10-25T09:09:57.617 回答