2012-09-12 37 views
46

Đang cố gắng truy vấn trong đó bản ghi Hoạt động đã cũ trong Chỉ mục Solr của tôi. Tôi muốn kiểm tra xem ngày Activity.updated trong cơ sở dữ liệu có lớn hơn Activity.added_toSolr_date cho cùng một bản ghi hay không.Cách tạo bộ lọc truy vấn Django so sánh hai trường ngày trong cùng một kiểu

stale_activities_queryset = Activity.objects.filter(updated__gte = self.added_toSolr_date) 

Mẫu

class Activity(models.Model): 
    # Last time entry/metric was updated in the Activity model database 
    updated = models.DateTimeField(verbose_name="CRUD date") 
    # When it was added to Solr Index Date 
    added_toSolr_date = models.DateTimeField(blank=True, null=True, verbose_name="Added to Solr Index Date") 

Tôi tham khảo tài liệu Django Query: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ Và đơn vị xét nghiệm cho mẫu: https://github.com/django/django/blob/master/tests/modeltests/or_lookups/tests.py

Cũng đã tìm kiếm ở đây trên Stackoverflow. Tất cả các ví dụ đều sử dụng ngày đã nhập thay vì so sánh hai trường ngày trong cùng một mô hình.

Trả lời

107

F objects.

from django.db.models import F 
stale_activities = Activity.objects.filter(updated__gte=F('added_toSolr_date')) 
+0

Cảm ơn bạn rất nhiều! Làm thế nào bạn phát hiện ra điều này? –

+3

@CarlosFerreira, qua nhiều năm sử dụng django mỗi ngày. Tôi thực sự không thể nói khi nào. –

+0

giải pháp tốt đẹp! gần như đăng cùng một câu hỏi – Ron

1

Các giải pháp của Yuji Tomita, không may, đã không làm việc.

Xem xét một mô hình dưới đây:

class list(models.Model): 
    text = models.CharField(max_length=140) 
    created = models.DateTimeField() 
    modified = models.DateTimeField() 

QuerySet:

my_list = todolist.objects.order_by('created').filter(created__gte=F('modified')) 

mẫu:

{% if my_list %} 
{% for list in my_list %} 
{{ list.text}} 
{% endfor %} 
{% else %} 
<p>there is no list</p> 
{% endif %} 

Cuối cùng tôi nhận được một danh sách rỗng, nhưng tôi biết, nó không phải là chính xác. Tôi cũng đã sử dụng các mục sau trong mẫu (không có bộ lọc truy vấn):

{% if list.created|date:'d m y h:i:s' == list.modified|date:'d m y h:i:s' %} 

Nó hoạt động nhưng tôi muốn thấy một giải pháp thanh lịch hơn.

+0

Đọc nhanh có vẻ như bạn đang làm hai việc khác nhau trong bộ lọc truy vấn và y mẫu mã của chúng tôi. Trước đây bạn đang sử dụng 'gte' và sau đó bạn đang sử dụng '=='.Đây có phải là lý do tại sao cả hai không tạo ra kết quả tương tự? Tôi đang cố gắng tìm ra lý do tại sao sử dụng 'mydate__exact = F ('my_other_date')' trong một truy vấn không hoạt động khi 'my_other_date' là None, bản thân tôi. – jenniwren

Các vấn đề liên quan