Cách tạo bộ lọc bộ truy vấn Django so sánh hai trường ngày trong cùng một mô hình


82

Đang cố gắng nhận một 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 Activity.updatedngày trong cơ sở dữ liệu có lớn hơn ngày Activity.added_toSolr_datetrong cùng một bản ghi hay không.

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

Mô hình

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 truy vấn Django: https://docs.djangoproject.com/en/1.4/ref/models/querysets/ Và các bài kiểm tra đơn vị cho các mẫu: https://github.com/django/django/blob/master/tests/ modeltests / or_lookups / tests.py

Cũng được tìm kiếm ở đây trên Stackoverflow. Tất cả các ví dụ 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.

Câu trả lời:


162

F đối tượng.

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

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

6
@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.
Yuji 'Tomita' Tomita

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

Cảm ơn! Tôi vẫn đang tìm kiếm điều này!
Alex Santos

2
Điều này dường như không thành công nếu một trong các ngày là NULL. Sử dụng Q để kiểm tra null hoặc so sánh và vẫn không thành công. Mặc dù nó sẽ không có trong MySQL, nhưng có ai khác thấy điều này không?
Paul Kenjora

3

Thật không may, giải pháp của Yuji Tomita đã không hoạt động.

Hãy 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()

Bộ truy vấn:

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

Bản 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 trống, nhưng tôi biết, nó không chính xác. Tôi cũng đã sử dụng phần sau bên trong mẫu (không có bộ lọc bộ 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.


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

Tôi đã có một lý do khác tại sao nó không hoạt động. Bằng cách sử dụng django-extensions TimeStampedModel, dấu thời gian createdupdateddấu bằng xuống mili giây. Có một sự chậm trễ tối thiểu. Cách khắc phục nhanh chóng của tôi là chỉ so sánh nó xuống thứ hai.
tschale
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.