1

I have 2 models called Car and Review . A user can write many reviews for a car. I am able to filter all the reviews for a certain car . The issue i'm facing is , I only want to filter all the reviews that belong to a particular car in less than 30 days and excluding the user who own the car.

This question support my question Getting all items less than a month old but I am unable to filter all the reviews that belong to a particular car in less than 30 days and excluding the user who own the car.

class Car(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=11)


class Review(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User)
    review = models.TextField()
    car = models.ForeignKey(Car)

Filter all the review for a particular car

Car = Car.objects.get(pk=1)
Review = Review.objects.filter(car=Car)

Filter all the review for a particular car but it retrieves all the reviews for everycar in 30 days which I don't want . I want to retrieve only the reviews in less than 30 days for a particular car and excluding the user who own the car

Car = Car.objects.get(pk=1)
from datetime import datetime, timedelta
last_month = datetime.today() - timedelta(days=30)
Review = Review.objects.filter(car__in=car,review__gte=month)

My question is How can I filter all the reviews for a particular car in less than 30 days and not including the reviews of the user who own the car .

thank you for helping me

Community
  • 1
  • 1
JackRoster
  • 1,603
  • 5
  • 16
  • 23

2 Answers2

2

First of all you need to filter on created field rather than on review field to lookup older entries:

from django.db import Q
from datetime import datetime, timedelta

Car = Car.objects.get(pk=1)
threshold = datetime.now() - timedelta(days=30)

# filtering step by step to give better understanding
reviews = Review.objects.filter(car__id=car.id) # filter by car first
reviews = reviews.filter(created__gte=threshold) # filter by datetime
reviews = reviews.filter(~Q(user__id=car.user.id)) # exclude user reviews who owns the car

# filtering in single step
reviews = Review.objects.filter(
    ~Q(user__id=car.user.id), car__id=car.id, created__gte=threshold)
Aamir Rind
  • 38,793
  • 23
  • 126
  • 164
  • `Review` is your model name. Make sure you are not overriding this accidently. As you were doing here `Review = Review.objects.filter(car=Car)` – Aamir Rind May 18 '13 at 14:24
  • Okay , I don't understand this error SyntaxError: non-keyword arg after keyword arg (, line 1) >>> WOW =Review.objects.filter(car__id=car.id,~Q(user__id=car.user.id)) – JackRoster May 18 '13 at 14:31
  • sorry my bad I have updated single step query `~Q(user__id=car.user.id)` should comes first in filter. – Aamir Rind May 18 '13 at 14:33
  • I also understand why it gave me that error , haha . Thank you Aamir – JackRoster May 18 '13 at 14:36
  • Aamir , Could you help me on this question if you have time please http://stackoverflow.com/questions/16625690/validating-email-as-username-when-logging-in-forms-py-error – JackRoster May 18 '13 at 15:04
1

How about following the relationship 'backwards' (https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects) :

from datetime import datetime, timedelta

threshold = datetime.now() - timedelta(days=30)
car = Car.objects.get(pk=1)
reviews = car.review_set.exclude(user=car.user).filter(created__gt=threshold)
AndrewS
  • 1,666
  • 11
  • 15