동일한 모델에서 두 개의 날짜 필드를 비교하는 Django 쿼리 셋 필터를 만드는 방법


82

내 Solr 색인에서 활동 레코드가 오래된 쿼리를 가져 오려고합니다. Activity.updated데이터베이스 의 날짜 Activity.added_toSolr_date가 동일한 레코드 의 날짜보다 큰지 확인하고 싶습니다 .

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

모델

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")

Django Query 문서를 참조했습니다 : https://docs.djangoproject.com/en/1.4/ref/models/querysets/ 샘플에 대한 단위 테스트 : https://github.com/django/django/blob/master/tests/ modeltests / or_lookups / tests.py

Stackoverflow에서도 여기에서 검색했습니다. 모든 예제는 동일한 모델의 두 날짜 필드를 비교하는 대신 입력 된 날짜를 사용합니다.

답변:


162

F 개체.

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

정말 고마워! 이것을 어떻게 발견 했습니까?
카를로스 페레이라

6
@CarlosFerreira, 수년간 django를 매일 사용했습니다. 나는 정말로 언제 말할 수 없다.
유지 'Tomita'Tomita

좋은 해결책! 거의 같은 질문을 게시했습니다
Ron

감사! 나는 이것을 찾고 있었다!
Alex Santos

2
날짜 중 하나가 NULL이면 실패한 것 같습니다. Q를 사용하여 null을 확인하거나 비교해도 여전히 실패합니다. MySQL에는 없지만 다른 사람이 이것을보고 있습니까?
폴 Kenjora

3

불행히도 Yuji Tomita의 해결책은 작동하지 않았습니다.

아래 모델을 고려하십시오.

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

쿼리 셋 :

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

주형:

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

결국 빈 목록이 표시되지만 정확하지 않습니다. 또한 템플릿 내에서 다음을 사용했습니다 (queryset 필터 없음).

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

효과가 있었지만 더 우아한 솔루션을보고 싶습니다.


빨리 읽으면 쿼리 셋 필터와 템플릿 코드에서 두 가지 다른 작업을 수행하는 것 같습니다. 전자에서는 'gte'를 사용하고 후자에서는 '=='를 사용합니다. 이것이 두 사람이 동일한 결과를 생성하지 않는 이유입니까? mydate__exact = F('my_other_date')'my_other_date'가 None, 나 자신 일 때 쿼리에서 사용 이 작동하지 않는 이유를 알아 내려고합니다 .
jenniwren

작동하지 않는 또 다른 이유가 있습니다. 사용 django-extensions TimeStampedModelcreatedupdated타임 스탬프는 1000 분의 1 초까지 동일. 최소한의 지연이 있습니다. 내 빠른 수정은 그것을 두 번째로 비교하는 것이 었습니다.
tschale
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.