您的位置:

报错FieldError("Joined field references are not permitted in this query")的解决

  发布时间:2023-03-11 10:21:32
报错的原因错误通常是在使用 Django 的 ORM 查询时出现的。如果存在相应的 "myapp_order" 行,那么它们的数据也会被获取。这样,你就可以在查询结果中直接访问每个 "myapp_product" 行的 "orders" 属性,该属性包含与该行相关的 "myapp_order" 行的查询结果。

报错的原因

"FieldError: Joined field references are not permitted in this query" 错误通常是在使用 Django 的 ORM 查询时出现的。

这个错误意味着你在查询中使用了表连接,但是没有使用 Django 的表连接功能(例如 `select_related()` 或 `prefetch_related()`)。

要解决这个错误,你可以使用 Django 的表连接功能来执行查询,而不是在查询字符串中手动添加表连接。

例如,如果你想使用表连接查询 "myapp_customer" 和 "myapp_order" 表,你可以使用以下代码:


from myapp.models import Customer, Order

# Use `select_related()` to perform a left outer join
customers = Customer

好的,继续关于表连接的信息:

在上面的示例中,我们使用了 `select_related()` 方法来执行左外连接,这意味着我们从 "myapp_customer" 表中获取了所有行,并且这些行可能有或没有相应的 "myapp_order" 行。如果存在相应的 "myapp_order" 行,那么它们的数据也会被获取。

如果你想使用内连接,你可以使用 `prefetch_related()` 方法:


from myapp.models import Customer, Order

# Use `prefetch_related()` to perform an inner join
customers = Customer.objects.prefetch_related("orders")

好的,继续关于表连接的信息:

如果你想使用表连接查询数据,并且你想要在结果中返回每个行的相应的 "myapp_order" 行的数量,你可以使用 `Count()` 聚合函数:


from django.db.models import Count

from myapp.models import Customer

# Use `Count()` to return the number of orders for each customer
customers = Customer.objects.annotate(num_orders=Count("orders"))

在上面的示例中,我们使用了 `annotate()` 方法来为每个 "myapp_customer" 行添加一个名为 "num_orders" 的字段,该字段包含该行的 "myapp_order" 行的数量。

如果你想要使用其他聚合函数,例如 `Avg()`、`Min()`、`Max()` 或 `Sum()`,你可以使用与 `Count()` 相同的方法。

好的,继续关于表连接的信息:

如果你想要使用表连接查询数据,并且你想要在结果中返回每个 "myapp_customer" 行的相应的 "myapp_order" 行的数据,你可以使用 `prefetch_related()` 方法:


from myapp.models import Customer

# Use `prefetch_related()` to return the orders for each customer
customers = Customer.objects.prefetch_related("orders")

如何解决

要解决 "FieldError: Joined field references are not permitted in this query" 错误,你需要使用 Django 的表连接功能来执行查询,而不是在查询字符串中手动添加表连接。

例如,如果你想使用表连接查询 "myapp_customer" 和 "myapp_order" 表,你可以使用以下代码:


from myapp.models import Customer, Order

# Use `select_related()` to perform a left outer join
customers = Customer.objects.select_related("orders")

在上面的示例中,我们使用了 `select_related()` 方法来执行左外连接,这意味着我们从 "myapp_customer" 表中获取了所有行,并且这些行可能有或没有相应的 "myapp_order" 行。如果存在相应的 "myapp_order" 行,那么它们的数据也会被获取。

如果你想使用内连接,你可以使用 `prefetch_related()` 方法:


from myapp.models import Customer, Order

# Use `prefetch_related()` to perform an inner join
custom

好的,继续关于表连接的信息:

如果你想要使用表连接查询数据,并且你想要在结果中返回每个 "myapp_customer" 行的相应的 "myapp_order" 行的数据,你可以使用 `prefetch_related()` 方法:


from myapp.models import Customer

# Use `prefetch_related()` to return the orders for each customer
customers = Customer.objects.prefetch_related("orders")

在上面的示例中,我们使用了 `prefetch_related()` 方法来获取 "myapp_customer" 表中的所有行,并且为每个行预先加载它的 "myapp_order" 行。这样,你就可以在查询结果中直接访问每个 "myapp_customer" 行的 "orders" 属性,该属性包含与该行相关的 "myapp_order" 行的查询结果。

好的,继续关于表连接的信息:

如果你想要使用表连接查询数据,并且你想要在结果中返回每个 "myapp_order" 行的相应的 "myapp_product" 行的数据,你可以使用 `prefetch_related()` 方法:


from myapp.models import Order

# Use `prefetch_related()` to return the products for each order
orders = Order.objects.prefetch_related("products")

在上面的示例中,我们使用了 `prefetch_related()` 方法来获取 "myapp_order" 表中的所有行,并且为每个行预先加载它的 "myapp_product" 行。这样,你就可以在查询结果中直接访问每个 "myapp_order" 行的 "products" 属性,该属性包含与该行相关的 "myapp_product" 行的查询结果。

如果你想使用多个表连接,你可以使用多个参数来调用 `prefetch_related()` 方法,例如:

``好的,继续关于表连接的信息:

如果你想要使用表连接查询数据,并且你想要在结果中返回每个 "myapp_product" 行的相应的 "myapp_category" 行的数据,你可以使用 `prefetch_related()` 方法:


from myapp.models import Product

# Use `prefetch_related()` to return the categories for each product
products = Product.objects.prefetch_related("categories")

在上面的示例中,我们使用了 `prefetch_related()` 方法来获取 "myapp_product" 表中的所有行,并且为每个行预先加载它的 "myapp_category" 行。这样,你就可以在查询结果中直接访问每个 "myapp_product" 行的 "categories" 属性,该属性包含与该行相关的 "myapp_category" 行的查询结果。

如果你想使用多个表连接,你可以使用多个参数来调用 `prefetch_related()` 方法,例如:


from myapp.models imp

使用例子

是的,有例子。例如,如果你有以下模型:


class Customer(models.Model):
    name = models.CharField(max_length=100)

class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    date = models.DateField()

class Product(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)

class Category(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

你可以使用以下代码来查询所有客户的所有订单,以及每个订单的所有产品:


from myapp.models import Customer

# Use `prefetch_related()` to return the orders and products for each customer
customers = Customer.objects.prefetch_related("orders__products")

for customer in customers:
    print(customer.name)
    for order in customer.orders.all():
        print("  Order:", order.date)
        for product in order.products.all():
            print("    Product:", product.name, product.price)

这样,你就可以使用表连接查询返回每个客户的所有订单和每个订单的所有产品。你也可以使用多个参数来调用 `prefetch_related()` 方法,以返回每个产品的所有类别:


from myapp.models import Customer

# Use `prefetch_related()` to return the orders, products, and categories for each customer
customers = Customer.objects.prefetch_related("orders__products__categories")

for customer in customers:
    print(customer.name)
    for order in customer.orders.all():
        print("  Order:", order.date)
        for product in order.products.all():
            print("    Product:", product.name,

当然。继续关于表连接的信息:

如果你想要使用表连接查询数据,并且你想要在结果中返回每个 "myapp_category" 行的相应的 "myapp_product" 行的数据,你可以使用 `prefetch_related()` 方法:


from myapp.models import Category

# Use `prefetch_related()` to return the products for each category
categories = Category.objects.prefetch_related("products")

在上面的示例中,我们使用了 `prefetch_related()` 方法来获取 "myapp_category" 表中的所有行,并且为每个行预先加载它的 "myapp_product" 行。这样,你就可以在查询结果中直接访问每个 "myapp_category" 行的 "products" 属性,该属性包含与该行相关的 "myapp当然。继续关于表连接的信息:

如果你想要使用表连接查询数据,并且你想要在结果中返回每个 "myapp_product" 行的相应的 "myapp_order" 行的数据,你可以使用 `prefetch_related()` 方法:


from myapp.models import Product

# Use `prefetch_related()` to return the orders for each product
products = Product.objects.prefetch_related("orders")

在上面的示例中,我们使用了 `prefetch_related()` 方法来获取 "myapp_product" 表中的所有行,并且为每个行预先加载它的 "myapp_order" 行。这样,你就可以在查询结果中直接访问每个 "myapp_product" 行的 "orders" 属性,该属性包含与该行相关的 "myapp_order" 行的查询结果。

如果你想使用多个表连接,你可以使用多个参数来调用 `prefetch_related()` 方法,当然。继续关于表连接的信息:

如果你想要使用表连接查询数据,并且你想要在结果中返回每个 "myapp_order" 行的相应的 "myapp_customer" 行的数据,你可以使用 `prefetch_related()` 方法:


from myapp.models import Order

# Use `prefetch_related()` to return the customers for each order
orders = Order.objects.prefetch_related("customers")

在上面的示例中,我们使用了 `prefetch_related()` 方法来获取 "myapp_order" 表中的所有行,并且为每个行预先加载它的 "myapp_customer" 行。这样,你就可以在查询结果中直接访问每个 "myapp_order" 行的 "customers" 属性,该属性包含与该行相关的 "myapp_customer" 行的查询结果。