Django中的模型完整性检查

Posted

技术标签:

【中文标题】Django中的模型完整性检查【英文标题】:Model integrity check in django 【发布时间】:2013-12-17 20:48:04 【问题描述】:

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

我在想也许一个独特的字段并正确检查数据库完整性会更好,但它是取消的字段让我烦恼如何选择独特的字段。你认为我的方法会有问题吗?我的意思是它是否确保不会在用户的开始日期和结束日期之间设置任何条目,他是否已经保存了一个?您认为此代码是否更好地进行预保存? db 将开始为空,因此在输入一个条目后,一切都会顺其自然(假设...不太确定...)

【问题讨论】:

也许是这样? Entry.objects.filter(creator=entry.creator, start__gte=entry.start, end__lte=end, canceled=True).exists() 在if语句中对吗? 当然。而是Entry.objects.get... 避免Entry.DoesNotExist 异常 我认为仅基于时间字段的重叠事件的正确查询是Entry.objects.filter(start_time__lt=entry.end_time, end_time__gt=entry.start_time) 即冲突事件必须在提议的新事件结束之前开始,并且必须在提议的新事件开始之后结束.显然,您可能还需要按取消状态进行过滤。 我会将这些范围检查放在EntryAddForm.clean() 而不是视图中。 【参考方案1】:

您需要使用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 对象。

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

【讨论】:

以上是关于Django中的模型完整性检查的主要内容,如果未能解决你的问题,请参考以下文章

通过避免 django 模型保存方法中的完整性错误来增加 slug

如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库

get_absolute_url 中的 django 完整 url

将现有站点更新为新的 Django 1.5 用户模型后 django_admin_log 上的完整性错误

在 django 中为模型创造完整历史的最佳方法是啥?

Django InlineModelAdmin:部分显示内联模型并链接到完整模型