django中的模型完整性检查

时间:2013-12-02 07:54:34

标签: django database-integrity

我有一个名为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 个答案:

答案 0 :(得分: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个对象。

使用此查询,您不需要任何唯一的检查。