【问题标题】:How to join multiple model using select_related?如何使用 select_related 加入多个模型?
【发布时间】:2021-11-07 09:25:28
【问题描述】:

我有几个模型,即

class Alpha(models.Model):
    name = models.CharField()

class XXX(models.Model):
    owner = models.ForeignKey(Alpha)

class YYY(models.Model):
    name = models.OneToOneField(Alpha)

现在像这样做 select_related 时

test = Alpha.objects.filter(id=pk).select_related('XXX')

它给了我Invalid field name(s) given in select_related, choices are YYY

我知道 YYY 在 OneToOne,所以它出现了 - 但是有没有办法获取 XXX 呢?还是我应该使用“prefetch_related”。但我不想使用预取,因为它只是进行缓慢的查询,同时我有 7 个模型需要与 select_related :(

【问题讨论】:

    标签: django


    【解决方案1】:

    您可以使用 prefetch_related 来实现这一点。此外,在外键字段中添加related_name 以供参考。

    class Alpha(models.Model):
        name = models.CharField()
    
    class XXX(models.Model):
        owner = models.ForeignKey(Alpha, related_name='xxx')
    
    class YYY(models.Model):
        name = models.OneToOneField(Alpha, related_name='yyy')
    
    Alpha.objects.filter(id=pk).prefetch_related('xxx', 'yyy')
    

    【讨论】:

    • prefetch_related 中,如果没有related_name,模型将无法使用其pk 作为外键引用其他模型。但在select_related 的情况下,该字段将已经存在以引用模型。您可以查看文档以获取更多详细信息。 docs.djangoproject.com/en/3.2/ref/models/querysets
    • 正在使用 prefetch_related 好,或者我可以简单地在其他模型上使用 select * 并将其作为单独的查询?
    • 我建议在处理多个表时使用 prefetch_related 和 select_related ,这是优化项目的好方法。
    【解决方案2】:

    您可以使用select_related 前往模型 1 的方向。 例如XXX.objects.all().select_related('alpha')

    但是当你从 1 变为许多时,你必须使用 prefetch_related

    所以Alpha.objects.all().prefetch_related('xxx')

    看看这个article

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 2018-09-13
      • 2018-11-17
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多