4

次のフィールドを持つ Entry という名前のモデルがあります

from django.contrib.auth.models import User

class Entry(models.Model):
    start = models.DateTimeField()
    end = models.DateTimeField()
    creator = models.ForeignKey(User)
    canceled = models.BooleanField(default=False)

新しいエントリを作成するときに、作成者が同じ開始日と終了日の間にすでにイベントを作成している場合、作成されたくありません。だから私の考えは、ユーザーが作成フォームからデータを投稿するときでした

if request.method == 'POST':
    entryform = EntryAddForm(request.POST)
    if entryform.is_valid():
        entry = entryform.save(commit=False)
        entry.creator = request.user

        #check if an entry exists between start and end
        if Entry.objects.get(creator=entry.creator, start__gte=entry.start, end__lte=entry.end, canceled=False):
            #Add to message framework that an entry allready exists there
            return redirect_to('create_form_page')
        else:
            #go on with creating the entry

おそらく一意のフィールドとデータベースの整合性を適切にチェックする方がよいと考えていましたが、一意のフィールドの選択方法に悩まされているのはキャンセルされたフィールドです。私の方法に何か問題があると思いますか? ユーザーの開始日と終了日の間にエントリが設定されないようにすることを意味しますか? このコードは事前保存に行く方が良いと思いますか? データベースは空で開始されるため、1 つのエントリを入力した後、すべてがそのコースをたどります (それを前提としています...よくわかりません...)

4

1 に答える 1

0

Q複雑なクエリに使用する必要があります。

from django.db.models import Q
_exists =   Entry.objects.filter(Q(
                     Q(Q(start__gte=entry.start) & Q(start__lte=entry.end)) | 
                     Q(Q(end__gte=entry.start) & Q(end__lte=entry.end)) | 
                     Q(Q(start__lte=enrty.start) & Q(end__gte=entry.end))
))
if _exists:
    "There is existing event"
else:
    "You can create the event"

私はこれをテストしていないので、Q必要と思われる場所ならどこでもオブジェクトを使用します。

このクエリを使用すると、一意のチェックは必要ありません。

于 2014-01-25T15:51:41.613 に答える