2011-03-11 18 views
5

Postgresql db tabanlı Django'da, aşağıdaki gibi bir datetimefield için zamana nasıl filtre uygulayabilirim?Django: datetime alanlarından sorgulama zamanı

class Foo(models.Model): 
    start_date = models.DateTimeField() 
    end_date = models.DateTimeField() 

IE: Foo "16:30" start_date ile "19:00" end_date nesneleri filtrelemek istiyorum.

Teşekkürler.

cevap

2

Bir TimeField'a ekleme hakkında ne dersiniz?

Aksi taktirde, DateTimeFields'ın Django'da yerel olarak bu yeteneğe sahip olmaması nedeniyle veritabanının zaman kabiliyetlerinden yararlanmak için özel bir sorgu yazmanız gerekir.

Start_date'den yeni start_time alanına saat ve dakikaları denormalize etmek için bir işlev yazmayı ve daha sonra start_time alanını sorgulamayı düşünebilirsiniz.

+0

Güzel, bir zaman alanımızın olduğunu farketmedik :) Teşekkürler! –

+0

Bunu kim reddetti? Belki de bunu reddettiğinizde bu çözümle neyle ilgili olduğunu söylemek için bir yorum ekleyin. Kaç kişinin veritabanlarını denormalize etmek istemediğini görmek beni şaşırtıyor. Benim için denormalizasyon korkusu aslında uygulama karmaşıklığını arttırıyor ve daha büyük büyüdükçe uygulamaları yavaşlatıyor. Bkz. Http://www.agiledata.org/essays/dataModeling101.html#Denormalize –

0

Foo.objects.filter(start_date = MyDate1, end_date = MyDate2) 

deneyin nerede MyDate1 ve MyDate2 tanımlı datetime nesnelerdir. Çalışmalı, değil mi? Kendi q

+0

alas 16:30, bir Zaman nesneleridir, aksi halde sorun yok. – Hellnar

1

Çözüm:

def query_by_times(start_hour, start_min, end_hour, end_min): 
     query = 'EXTRACT(hour from start_date) = %i and EXTRACT(minute from start_date) = %i and EXTRACT(hour from end_date) = %i and EXTRACT(minute from end_date) = %i' % (start_hour, start_min, end_hour, end_min) 
     return Foo.objects.extra(where=[query]) 
+1

Bir işlev yürüten herhangi bir sorgunun, böyle bir çağrıyı çağırması, kayıt sayısı arttıkça yavaşlayacaktır. Bir noktada, yavaşlama fark ederseniz, denormalizasyon okumalarda hız avantajları sunmalıdır. –

-1

Bence İhtiyacınız aralığını kullanır [1]. senin durumda

[1] http://docs.djangoproject.com/en/1.2/ref/models/querysets/#range

1

, veritabanı normalleştirme yürütme zamanı ve sistem yüküne beri, thebest çözüm gibi görünüyor

from datetime import time 
records = Foo.objects.all() 
filtered = filter(lambda x: (time(16,30)==x.start_date.time() and time(19,0)==x.end_date.time()), records) 
: En ilgili veritabanı tablosu daha kayıtlarını tutar olarak lambda yanında filtre kullanarak veritabanı dosyalayıcı fonksiyonlarını kullanmadan bu yapmak ...

Başka bir çözüm artacak

Ancak bunu büyük bir veri kümesinde kullanmak çok fazla zamana ve sistem kaynağına ihtiyaç duyacaktır.