【问题标题】:Get objects which have NO relation to the current object获取与当前对象没有关系的对象
【发布时间】:2017-02-12 16:43:44
【问题描述】:

我目前正在更新不同产品的订阅者(客户)的 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 来获取未列出订阅的客户列表?如果没有,关于获得想要结果的干净方法的任何建议?

【问题讨论】:

    标签: django foreign-keys filtering


    【解决方案1】:

    您可以根据customer 获得subscriptionscount,然后在没有subscriptions 的情况下获得.filtercustomers。像这样的东西应该可以解决问题:

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

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

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

    【讨论】:

    • 感谢您的快速回复。一旦我点击过滤器按钮,使用此示例就会进入无限加载状态。我无法访问 ipdb 或其他任何要调试的东西。有什么建议为什么会发生这种情况?
    • 嗯,这可能是一个缓慢的查询。你能运行类似show full processlist;(这是针对MySQL的)的东西,看看在加载状态下是否有任何查询正在执行。那么,如果是这样的话,我们就可以开始寻找优化它的方法了。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2011-10-16
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2011-10-08
    • 2016-08-03
    相关资源
    最近更新 更多