如何在Django中使用条件表达式查询数据库?

如何在Django中使用条件表达式查询数据库?,django,django-models,django-queryset,django-1.8,Django,Django Models,Django Queryset,Django 1.8,我有三种模式:业务模式、报价模式和报价计划: 业务: class Business(models.Model): name_of_business = models.CharField(max_length=255) 提供: class Offers(models.Model): business = models.ForeignKey(Business, related_name="business_offer",

我有三种模式:业务模式、报价模式和报价计划: 业务:

class Business(models.Model):
    name_of_business = models.CharField(max_length=255)
提供:

class Offers(models.Model):
    business = models.ForeignKey(Business, related_name="business_offer",
                                 on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    subtext = models.CharField(max_length=255)
报价计划:

class OfferPlan(models.Model):
    WEEKDAYS = [
        (1, _("Monday")),
        (2, _("Tuesday")),
        (3, _("Wednesday")),
        (4, _("Thursday")),
        (5, _("Friday")),
        (6, _("Saturday")),
        (7, _("Sunday")),
    ]
    offer = models.ForeignKey(Offers, related_name="business_offer_plan",
                              on_delete=models.CASCADE)
    weekday = models.IntegerField(
        choices=WEEKDAYS,
    )
    from_hour = models.TimeField()
    to_hour = models.TimeField()
我有一个ListView,它可以根据不同的参数(如城市、类别等)搜索打开的业务。我现在还想在工作日搜索,比如周一打开的业务将显示,而当天不显示的业务。工作日信息存储在OfferPlan中,OfferPlan表中当天的报价可能有多个计时,但我想查询(筛选、排除)在该工作日编号上甚至只有一个条目的企业

这是我的列表视图:

class SearchListView(ListView):
    template_name = 'search/search.html'
    model = Business

    def get_queryset(self):
        # queryset = Business.objects.filter(business_address__city=AppLocations.objects.first().city)
        if 'city' in self.request.GET:
            queryset = Business.objects.filter(business_address__city=self.request.GET.get('city'))

        if 'category' in self.request.GET:
            queryset = queryset.filter(category__code=self.request.GET.get('category'))

        # if 'date' not in self.request.GET:
        #     queryset = B
        raise
        return queryset
这怎么可能呢?也调查过了,但没能搞清楚

谢谢


更新1
在网上做了更多的研究之后,我发现这是如何实现的,但我需要从其他Django爱好者那里确定这是正确的

queryset.filter(business_offer__business_offer_plan__weekday=1).annotate(count_entry=Count('business_offer__business_offer_plan__weekday')).filter(count_entry__gt=1)

解决方案
Jefferson的解决方案被标记为正确答案,因为它提供了更多的见解,关于哪个查询是快速的,以及我以前的更新有什么问题,所以下面是我们都同意的正确解决方案:


queryset.filter(business\u offer\u business\u offer\u plan\u weekday=1)。notation(count\u entry=count('business\u offer\u business\u offer\u plan\u weekday'))。filter(count\u entry\u gte=1)
这里没有条件表达式,而且您的注释太复杂了。你只需要一个额外的过滤器

queryset.filter(business_offer__business_offer_plan__weekday=self.request.GET['weekday'])

这里没有条件表达式,而且您的注释太复杂了。你只需要一个额外的过滤器

queryset.filter(business_offer__business_offer_plan__weekday=self.request.GET['weekday'])
有一个沉重的疑问,但它的工作


有一个繁重的查询,但它可以工作。

谢谢,但这不会像预期的那样工作,除非您这样调用,
queryset.filter(business\u offer\u business\u offer\u offer\u plan\u weekday=self.request.GET['weekday'])。distinct()
,否则它将返回同一业务和优惠的多个实例。谢谢,但这不会像预期的那样工作,在您这样调用它之前,
queryset.filter(business\u offer\u business\u offer\u plan\u weekday=self.request.GET['weekday']).distinct()
,否则它将返回相同业务和优惠的多个实例。谢谢,但请查看我的
更新1
,并告诉我这是否也是一个好方法?@Maverick yes,我和你的查询错误:在你的查询修复中的D:最后一个过滤器应该是“filter(count_entry_ugte=1)”@Maverick修复了我的查询(忘记在最后添加“distinct”)。我的查询即使不添加gte也可以工作,因为我只是寻找大于1、大于等于不重要,怎么说?:)@Maverick如果业务部门今天有1个报价计划,它将不在查询结果中,谢谢,但请查看我的
更新1
,并告诉我这是否也是一个好方法?@Maverick是的,我和你的查询错误:在你的查询修复中:最后一个过滤器应该是“过滤器(计数项\u gte=1)”@Maverick修复了我的查询(只是忘记在最后添加“distinct”)。即使不添加gte,我的也能正常工作,因为我只是在寻找大于1的值,大于等于1的值并不重要,怎么说?:)@Maverick如果业务部门当天有1个offerplan,它将不会出现在查询结果中