You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework出现AttributeError:关联查询产品与评分表失败

Troubleshooting the AttributeError When Serializing Product with ProductRatings

Hey there! Let's work through that AttributeError you're hitting when trying to fetch all Product data along with their related ProductRatings. I've dealt with similar DRF serializer issues before, so here are the most common fixes to check step by step:

First up, make sure your ProductRating model's foreign key to Product uses the exact related_name you're referencing in the serializer (product_ratings). DRF relies on this name to find the reverse relationship, and a mismatch here will throw an AttributeError immediately.

Example of the correct model setup:

# models.py
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=255)
    # Add your other product fields here

class ProductRating(models.Model):
    product = models.ForeignKey(
        Product,
        on_delete=models.CASCADE,
        related_name="product_ratings"  # This must match the serializer field name!
    )
    rating = models.IntegerField()
    reviewer_name = models.CharField(max_length=255)

If your view isn't prefetching the product_ratings data, DRF might struggle to access the related objects (especially for one-to-many relationships). Always use prefetch_related for reverse foreign key relationships to optimize queries and avoid serialization errors.

For a ModelViewSet, override the get_queryset method like this:

# views.py
from rest_framework import viewsets
from .models import Product
from .serializers import ProductSerializer

class ProductViewSet(viewsets.ModelViewSet):
    serializer_class = ProductSerializer

    def get_queryset(self):
        # Prefetch the related ratings to avoid N+1 queries and ensure data is available
        return Product.objects.all().prefetch_related("product_ratings")

3. Double-Check Serializer Field Configuration

Ensure your ProductSerializer explicitly includes the product_ratings field in its fields list. If you're using __all__, confirm the reverse relationship name is recognized by the model (which ties back to step 1).

Correct serializer setup:

# serializers.py
from rest_framework import serializers
from .models import Product, ProductRating

class ProductRatingSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductRating
        fields = ["id", "rating", "reviewer_name"]

class ProductSerializer(serializers.ModelSerializer):
    # Declare the nested serializer for related ratings
    product_ratings = ProductRatingSerializer(many=True)

    class Meta:
        model = Product
        fields = ["id", "name", "product_ratings"]  # Include product_ratings here

4. Check for Typos (Yes, Really!)

It's easy to miss a lowercase letter or underscore. Double-check that:

  • The related_name in ProductRating is exactly product_ratings
  • The field name in ProductSerializer matches that related_name
  • You're using the same name in prefetch_related

5. Test the Relationship in Django Shell

To isolate the issue, fire up the Django shell and test if you can access the related ratings directly from a Product instance:

python manage.py shell

Then run:

from your_app.models import Product
product = Product.objects.first()
print(product.product_ratings.all())  # This should return a queryset of ratings, not throw an error

If this throws an AttributeError, the problem is definitely in your model relationship setup, not the serializer.


内容的提问来源于stack exchange,提问作者devmrh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:31:24