【问题标题】:Fetch multiple rows from multiple models Django从多个模型 Django 中获取多行
【发布时间】:2017-11-25 05:50:03
【问题描述】:

我有这个项目,我需要从视图中的多个模型中获取多个对象。我可以通过 for 循环来做到这一点,但我认为我不应该在每个循环中都访问数据库。我应该使用prefetch_related。或者我是否应该知道其他方法来检索它们。

例如:

class A(models.Model):
     title_name=models.CharField(...)
     id=models.AutoField(pk=True)

class B(models.Model):
     user=models.ForeignKey(User,models.ON_CASCADE=True)
     user_status=models.CharField(...)
     id=models.ForeignKey(A, models.ON_CASCADE=True)

我需要显示user_status, user 和关联的title_name。我得到了多个对象,select_related 将没有用。有什么建议。

【问题讨论】:

  • 尝试使用属性
  • 是的,您应该使用prefetch_related。没有比这更好的办法了
  • @Gahan 你能告诉我如何使用属性
  • @SardorbekImomaliev 我试过prefetch_related,我不能完全按照我的意愿去做,我做了一个类似 B.objects.get(user=request.user).prefetch_related 的查询('id')
  • 看这个:stackoverflow.com/questions/3046398/… 你可以在类中实现你想在视图中调用的函数,在属性中你可以使用函数来获取相关值到你的模型

标签: django database model


【解决方案1】:

你需要做这个查询集:

B.objects.all().select_related('user', 'id')

此查询集将生成连接用户和来自 db 的数据的 sql

接下来,在模型B中制作一个属性:

@property
def title_name(self):
    return self.id.title_name

最后你会得到一个查询集,它向数据库发出一个 SQL 请求并返回你需要的所有数据。

顺便说一句,我会将模型 B 中的属性“id”重命名为“a”。

【讨论】:

  • 我想过滤 B 对象,all() 方法可能很昂贵。
  • @joelvarma select_related 方法在这种情况下会起作用,因为 id 是外键。如果要过滤 A 模型,则需要使用 prefetch_related
  • 是的,我想过滤A,那么我应该如何使用prefetch_related
猜你喜欢
  • 2018-07-02
  • 2020-10-17
  • 2011-11-04
  • 2021-12-24
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
相关资源
最近更新 更多