在django中使用prefetch_related或select_related来实现这一点的正确方法是什么

trnvg8h3  于 2023-08-08  发布在  Go
关注(0)|答案(2)|浏览(90)

嘿伙计们我有这些模型

class Theme(models.Model):
    name = models.charfield()
class Category(models.Model):
    name = models.charfield()
class Product(models.Model):
    category = models.ForeginKey(Category)
    theme = models.ForeignKet(Theme)
    ......
class Order(models.Model):
    product = models.ForeigKey(Product)

字符串
我想在一个查询中从订单示例中获取产品和产品的类别,我知道对于forward foreignkey,你应该使用select related,但我不认为有一种方法来获取产品类别,当你使用这个:

Order.objects.all().select_related('product')


那么用这一个对吗?

Order.objects.all().prefetch_related('product__category')


我最后一个问题,假设我有这些模型:

class Category(models.Model):
    name = models.charfield()
class Product(models.Model):
    category = models.ForeginKey(Category)
    theme = models.ForeignKet(Theme)
class Course(models.Model):
    category = models.ForeginKey(Category)
    ......
class Order(models.Model):
    product = models.ForeigKey(Product)


如果我有产品,我想获取也类别和课程相关的这个类别太

product = LvaProducts.objects.all().select_related('category')[0]
courses = product.category.course_set


这是最有效的方法吗

sigwle7e

sigwle7e1#

因为OrderProduct是 * 多对一 * 关系,ProductCategory是 * 多对一 * 关系,所以你可以通过**.select_related(…)**[Django-doc]获取这两个关系:

Order.objects.select_related('product__category')

字符串

o2g1uqev

o2g1uqev2#

您可以在select_related调用中使用双下划线链接关系

Order.objects.all().select_related('product__category')

字符串
编辑:您可以使用相同的技术在相关模型上运行预取

Product.objects.select_related(
    'category'
).prefetch_related(
    'category__course_set'
)

相关问题