无法在 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'))