首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django中的模型完整性检查

django中的模型完整性检查
EN

Stack Overflow用户
提问于 2013-12-02 15:54:34
回答 1查看 864关注 0票数 4

我有一个名为Entry的模型,它有以下字段

代码语言:javascript
运行
复制
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)

当我创建一个新条目时,如果创建者在相同的开始日期和结束日期之间已经创建了一个已创建的事件,我不希望被创建。所以我的想法是当用户从创建表单发布数据时

代码语言:javascript
运行
复制
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

我在想,也许一个唯一的字段和适当的数据库完整性检查会更好,但它是被取消的字段,困扰着我如何选择唯一的字段。你觉得我的方法会有问题吗?我的意思是,它是否确保在开始和结束日期之间不会为用户设置条目,他是否已经保存了条目?你认为这段代码去预存会更好吗?数据库一开始将是空的,所以在输入一个条目之后,一切都会按它的方式进行(假设that...not确实确定...)

EN

回答 1

Stack Overflow用户

发布于 2014-01-25 23:51:42

对于复杂的查询,您需要使用Q

代码语言:javascript
运行
复制
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对象。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20323309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档