如何在Django

时间:2017-10-31 16:44:41

标签: django django-models orm

我有这些模特:

class Customer(models.Model):
    ....

class Job(models.Model):
    customer = models.ForeignKey('Customer')
    payment_status = models.ForeignKey('PaymentStatus')
    cleaner = models.ForeignKey(settings.AUTH_USER_MODEL,...)

class PaymentStatus(models.Model): 
    is_owing = models.NullBooleanField()

我需要找出每个工作,父客户拥有的总工作量,但只显示属于当前用户的那些工作。查询集应该是这样的:

user = self.request.user
queryset = Job.objects.select_related('customer'
    ).filter(payment_status__is_owing=True).annotate(
                num_owings=RawSQL('count(jobs_job.id) over (partition by customer_id)', ())
                                       ).filter(cleaner=user)

我正在使用'select_related'来显示与该职位相关的客户的字段。

首先,如果没有窗口函数/原始SQL,我还没有找到一种方法。 其次,无论我在何处放置.filter(window_cleaner = user)(在annotate()之前或之后),最终结果总是排除总计数中不属于当前用户的作业。我需要从显示中排除作业,而不是从窗口函数中的计数中排除。 我可以做整个事情作为原始SQL,但我希望有一个更好的方式在Django中做到这一点。 谢谢!

1 个答案:

答案 0 :(得分:0)

我不知道这是否有帮助,这实际上取决于您希望如何向用户显示结果。然而,如果是我自由地设计方面,我可能会分裂我的窗口。也许父母客户的所有工作总数位于顶部,而下一个属于当前用户的工作的单独列表。然后,我将分割正常查询的数据构造,就像当前用户相关的作业一样,然后使用自定义模板标记来计算父客户的作业总数。

我使用自定义模板标签相当多。我发现它们对于我们都希望向用户显示的快速快照总数来说非常酷。例如......积累的积分总数,未完成任务的数量等等。

如果您之前没有查看过它们,请查看https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/

上的文档

它们非常易于使用。