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'))

これは、データベースに過去の会議がないことを前提としています。これは、あなたのソリューションもそうである必要があるためです。そうでない場合は、過去の会議を除外するために、明らかにもう 1 つのフィルターが必要になります。

于 2013-10-25T09:09:57.617 に答える