【问题标题】:How to handle Many-to-Many Relation in Django without an Intermediary Table?如何在没有中间表的情况下处理 Django 中的多对多关系?
【发布时间】:2021-12-02 22:39:55
【问题描述】:

我继承了一个奇怪的表结构:

class Customer(models.Model):
    account_number = models.CharField()

class Subscription(models.Model):
    account_number = models.CharField()

因此,客户模型和订阅模型通过帐号链接。每个客户可以有多个订阅,每个订阅可以有多个客户,但是没有中间表;没有“帐户”表。我该如何处理这种事情?如果我有一个订阅查询集,我如何去获取相应的客户查询集而不做一个可怕的长查询,比如

customers = Customer.objects.filter(account_number__in=list(subscriptions.values_list('account_number', flat=True)))

我试图避免这种情况,因为它会生成大量查询,需要很长时间才能执行。

【问题讨论】:

    标签: django django-models m2m


    【解决方案1】:

    因为它没有 m2m 表,所以这可能是最好的方法。但是,您可以稍微优化查询以利用 Django 在 where 语句中使用子查询而不是帐号列表。

    subs = subscriptions.only('account_number').all()
    customers = Customer.objects.filter(account_number__in=subs) 
    
    # if you print out the query you should see a subquery in the query where statement
    print(customers.query)
    

    【讨论】:

    • 谢谢!导致的子查询实际上是错误的——它选择订阅 ID 而不是帐户 ID。但是 .only('account_number') 位节省了一些时间,所以谢谢;我忘记了它的存在。
    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2021-01-28
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多