1

我有 2 个模型,称为 Car 和 Review 。用户可以为汽车撰写许多评论。我可以过滤某辆车的所有评论。我面临的问题是,我只想在 30 天内过滤属于特定汽车的所有评论,并且不包括拥有该汽车的用户。

这个问题支持我的问题得到不到一个月的所有物品,但我无法在不到 30 天内过滤属于特定汽车的所有评论,并且不包括拥有汽车的用户。

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)

过滤特定汽车的所有评论

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

过滤特定汽车的所有评论,但它会在 30 天内检索每辆车的所有评论,这是我不想要的。我只想在 30 天内检索特定汽车的评论,不包括拥有该汽车的用户

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)

我的问题是如何在 30 天内过滤特定汽车的所有评论,而不包括拥有该汽车的用户的评论。

感谢你们对我的帮助

4

2 回答 2

2

首先,您需要过滤created字段而不是review字段以查找较旧的条目:

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)
于 2013-05-18T14:10:28.550 回答
1

如何遵循“向后”关系(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)
于 2013-05-18T14:30:25.050 回答