2013-12-02 5 views
4

У меня есть модель под названием запись, которая имеет следующие полямодели в Джанго

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) 

Когда я создаю новую запись, я не хочу быть создан, если создатель имеет Allready созданного события между одинаковые даты начала и окончания. Так что моя идея была, когда сообщения пользовательских данные из формы создания

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 

Я думал, что, может быть, единственное поле и проверка правильно дб целостностью будет лучше, но это отмененное поле, которая беспокоит меня в том, как выбрать уникальные поля. Вы думаете, что с моим методом будет что-то неправильно? Я имею в виду, не делает ли он, что никакая запись не будет установлена ​​между датой начала и окончания для пользователя, он уже сохранил ее? Считаете ли вы, что этот код лучше подходит для предварительного сохранения? ДБ начнет пуст, поэтому после ввода одной записи все будет проходить (при условии, что ... не совсем уверен ...)

+0

Возможно, так? 'Entry.objects.filter (creator = entry.creator, start__gte = entry.start, end__lte = end, cancel = True) .exists()' – crazyzubr

+0

В правиле if правильно? – Apostolos

+0

Несомненно. вместо 'Entry.objects.get ...' Чтобы исключить исключение 'Entry.DoesNotExist' – crazyzubr

ответ

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 объекты везде, где я думал, что было бы необходимо.

Используя этот запрос, вам не понадобится уникальная проверка.

Смежные вопросы