获取与当前对象无关的对象

时间:2016-10-04 13:26:54

标签: django foreign-keys filtering

我目前正在研究不同产品的订户(客户)X-Y矩阵的更新。最初它是一个包含大约的矩阵。 500个客户和24个产品。为了加快渲染速度,我们实现了一些过滤方法(A-Z /商务类型过滤,有效/过期等)。

另一个要求是能够过滤掉根本没有订阅的客户,例如下表中的客户C和D.

|           | subsc A | subsc B | subsc C | subsc D | subsc E |
|-----------|---------|---------|---------|---------|---------|
|customer A |  valid  |    -    |    -    | expired |    -    |
|customer B |    -    |  ended  |    -    |  valid  |    -    |
|customer C |    -    |    -    |    -    |    -    |    -    |
|customer D |    -    |    -    |    -    |    -    |    -    |
|customer E | expired |    -    |  valid  |    -    |    -    |

订阅表如下所示(简化):

class Subscription(models.Model):
    product = models.ForeignKey(Product)
    customer = models.ForeignKey(Customer)
    startDate = models.DateField(default=datetime.date.today)
    endDate = models.DateField()
    blank=True, null=True)
    ended = models.BooleanField(default=False)

是否有任何django-magic来获取没有列出订阅的客户列表?如果没有,有什么关于干净方法的建议来获得想要的结果吗?

1 个答案:

答案 0 :(得分:1)

您可以按count获得subscriptions customer,然后.filter customers而不subscriptions。这样的事情可以解决问题:

unsubscribed = Customer.objects.annotate(
        subscription_count=models.Count('subscription')
    ).filter(subscription_count=0)

另一种方式(应该更快)是使用__isnull符号来反对FK的反向关系。方法如下:

 unsubscribed = Customer.objects.filter(subscription__isnull=True)