2

start_dateとend_dateを持つ単純なイベントのモデルがあり、重要な部分は日付範囲が一意である必要があることです。

そのため、日付範囲が一意であるかどうかをチェックするクエリlike(Q)フィルターを作成しました。とにかく、私の問題はビューの部分にあります。ユーザーが最初の日付のイベント追加ページにアクセスしたときにイベントオブジェクトを作成する必要があります(ユーザーは日付範囲の一意性に関して後で変更できます)

イベントオブジェクトに含まれない日を決定(フィルター)するにはどうすればよいですか?または今月に利用可能な日付がある場合は?djangoフィルターまたはいくつかのスマートなアプローチで...

#model:
class Event(models.Model):

    user = models.ForeignKey(User)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    status = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        try:
            Event.objects.get(
                Q(user=self.user, status=1),
                Q(start_date__range=(self.start_date, self.end_date))
                |Q(end_date__range=(self.start_date, self.end_date))
                |Q(start_date__lte=self.start_date, end_date__gte=self.end_date)
            )
            raise IntegrityError("Error message")
        except Event.DoesNotExist:
            super(Event,self).save(*args,**kwargs)

私の見解では、イベントの詳細を更新/編集するために、初期の日付でイベントオブジェクトを作成し、URLにリダイレクトするための関数が1つあります。

#view:
try:
    event = Event.objects.create(user=request.user,
                                 start_date=datetime.date.today(), 
                                 end_date=datetime.date.today())
except IntegrityError, e:
    return HttpResponse(e)

ps:いくつかの異なる設計アプローチでこれを行うより賢い方法があれば、私は聞いてうれしいです。

4

1 に答える 1

2

あなたの質問の核心ではありませんが、MultipleObjectsReturnedここではケースをカバーしていないことに注意してください:

    try:
        Event.objects.get(
            Q(user=self.user, status=1),
            Q(start_date__range=(self.start_date, self.end_date))
            |Q(end_date__range(self.start_date, self.end_date))
            |Q(start_date__lte=self.start_date, end_date__gte=self.end_date)
        )
        raise IntegrityError("Error message")
    except Event.DoesNotExist:
        super(Event,self).save(*args,**kwargs)

いいと思います

    if Event.objects.filter(
        Q(user=self.user, status=1),
        Q(start_date__range=(self.start_date, self.end_date))
        | Q(end_date__range(self.start_date, self.end_date))
        | Q(start_date__lte=self.start_date, end_date__gte=self.end_date)
    ):
        raise IntegrityError("Error message")
    else:
        super(Event,self).save(*args,**kwargs)
于 2012-05-14T02:36:01.073 に答える