无法在 Django 中完成复杂的查询
Cant complete a complex query in Django
我有这两个表:
class HotelInfo(models.Model):
country_area = models.CharField(max_length=45)
hotel_id = models.CharField(primary_key=True, max_length=32)
hotel_name = models.TextField(blank=True, null=True)
hotel_url = models.TextField(blank=True, null=True)
hotel_address = models.TextField(blank=True, null=True)
review_score = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
review_qty = models.IntegerField(blank=True, null=True)
clean = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
comf = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
loct = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
fclt = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
staff = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
vfm = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
wifi = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
class Meta:
managed = False
db_table = 'hotel_info'
unique_together = (('hotel_id', 'country_area'),)
verbose_name_plural = "hotels"
class HotelReviews(models.Model):
uuid = models.CharField(primary_key=True, db_column='UUID', max_length=36, blank=True)
hotel = models.ForeignKey(HotelInfo, on_delete=models.DO_NOTHING)
review_title = models.TextField(blank=True, null=True)
review_url = models.TextField(blank=True, null=True)
review_score = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
review_date = models.DateField(blank=True, null=True)
reviewer_name = models.TextField(blank=True, null=True)
hash_reviewer_name = models.CharField(max_length=200, blank=True, null=True)
reviewer_location = models.CharField(max_length=100, blank=True, null=True)
posting_conts = models.IntegerField(blank=True, null=True)
positive_content = models.TextField(blank=True, null=True)
negative_content = models.TextField(blank=True, null=True)
tag_n1 = models.TextField(blank=True, null=True)
tag_n2 = models.TextField(blank=True, null=True)
tag_n3 = models.TextField(blank=True, null=True)
tag_n4 = models.TextField(blank=True, null=True)
tag_n5 = models.TextField(blank=True, null=True)
staydate = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'hotel_reviews'
verbose_name_plural = "Reviews"
这是我的序列化程序文件:
from rest_framework import serializers
from .models import HotelInfo
from .models import HotelReviews
class HotelInfoSerializer(serializers.ModelSerializer):
class Meta:
model = HotelInfo
fields = '__all__'
class HotelReviewSerializer(serializers.ModelSerializer):
class Meta:
model = HotelReviews
fields = '__all__'
我想在 2019 年获得 5 个以上 reviews_qty 的酒店,然后获得 2 个日期之间的评论,这就是我目前拥有的:
queryset = HotelReviews.objects.filter(review_date__range=('2018-01-01', '2019-12-12')).filter(hotel__review_qty__gte=5).select_related('hotel')
我想我需要使用 active_not_deleted,但不知道如何在 2019 年只获取评论超过 5 条的酒店。
如果发布评论时该字段未被考虑在内,您将无法使用该字段 review_qty
(这只是一个整数,无法知道日期) .因此,您需要用当年的评论数量来注释您的酒店。类似于:
from django.db.models import Count, Q
hotel_with_2019_reviews = HotelReviews.objects.filter(
review_date__range=('2019-01-01', '2019-12-31')
).values('hotel').annotate(
review_qty=Count('id')
).filter(review_qty__gte=5)
与其浏览酒店评论,不如从酒店开始?
试试这个
Hotels.objects.filter(review_qty__lte=5).hotel_reviews_set.filter(review_date__range=('2018-01-01', '2019-12-12'))
我有这两个表:
class HotelInfo(models.Model):
country_area = models.CharField(max_length=45)
hotel_id = models.CharField(primary_key=True, max_length=32)
hotel_name = models.TextField(blank=True, null=True)
hotel_url = models.TextField(blank=True, null=True)
hotel_address = models.TextField(blank=True, null=True)
review_score = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
review_qty = models.IntegerField(blank=True, null=True)
clean = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
comf = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
loct = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
fclt = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
staff = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
vfm = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
wifi = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
class Meta:
managed = False
db_table = 'hotel_info'
unique_together = (('hotel_id', 'country_area'),)
verbose_name_plural = "hotels"
class HotelReviews(models.Model):
uuid = models.CharField(primary_key=True, db_column='UUID', max_length=36, blank=True)
hotel = models.ForeignKey(HotelInfo, on_delete=models.DO_NOTHING)
review_title = models.TextField(blank=True, null=True)
review_url = models.TextField(blank=True, null=True)
review_score = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
review_date = models.DateField(blank=True, null=True)
reviewer_name = models.TextField(blank=True, null=True)
hash_reviewer_name = models.CharField(max_length=200, blank=True, null=True)
reviewer_location = models.CharField(max_length=100, blank=True, null=True)
posting_conts = models.IntegerField(blank=True, null=True)
positive_content = models.TextField(blank=True, null=True)
negative_content = models.TextField(blank=True, null=True)
tag_n1 = models.TextField(blank=True, null=True)
tag_n2 = models.TextField(blank=True, null=True)
tag_n3 = models.TextField(blank=True, null=True)
tag_n4 = models.TextField(blank=True, null=True)
tag_n5 = models.TextField(blank=True, null=True)
staydate = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'hotel_reviews'
verbose_name_plural = "Reviews"
这是我的序列化程序文件:
from rest_framework import serializers
from .models import HotelInfo
from .models import HotelReviews
class HotelInfoSerializer(serializers.ModelSerializer):
class Meta:
model = HotelInfo
fields = '__all__'
class HotelReviewSerializer(serializers.ModelSerializer):
class Meta:
model = HotelReviews
fields = '__all__'
我想在 2019 年获得 5 个以上 reviews_qty 的酒店,然后获得 2 个日期之间的评论,这就是我目前拥有的:
queryset = HotelReviews.objects.filter(review_date__range=('2018-01-01', '2019-12-12')).filter(hotel__review_qty__gte=5).select_related('hotel')
我想我需要使用 active_not_deleted,但不知道如何在 2019 年只获取评论超过 5 条的酒店。
如果发布评论时该字段未被考虑在内,您将无法使用该字段 review_qty
(这只是一个整数,无法知道日期) .因此,您需要用当年的评论数量来注释您的酒店。类似于:
from django.db.models import Count, Q
hotel_with_2019_reviews = HotelReviews.objects.filter(
review_date__range=('2019-01-01', '2019-12-31')
).values('hotel').annotate(
review_qty=Count('id')
).filter(review_qty__gte=5)
与其浏览酒店评论,不如从酒店开始? 试试这个 Hotels.objects.filter(review_qty__lte=5).hotel_reviews_set.filter(review_date__range=('2018-01-01', '2019-12-12'))