Неправильно настроенный вложенный ресурс с использованием HyperlinkedModelSerializer

Я выбралDjango REST Framework а такжеDRF-гнездовые-маршрутизаторы построить API дляТовары а такжеProductReports, Вот соответствующие классы:

# models.py
from django.db import models


class Product(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)


class ProductReport(models.Model):
    user_name = models.CharField(max_length=256, blank=False)
    created_at = models.DateTimeField(auto_now_add=True)
    product = models.ForeignKey('Product', default=1)

...

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


class ProductSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Product


class ProductReportSerializer(serializers.HyperlinkedModelSerializer):

    product = ProductSerializer()

    class Meta:
        model = ProductReport

...

# views.py
from django.shortcuts import render
from rest_framework import viewsets, mixins
from rest_framework.response import Response
from models import Product, ProductReport
from serializers import ProductSerializer, ProductReportSerializer


class ProductViewSet(mixins.RetrieveModelMixin,
                   mixins.ListModelMixin,
                   viewsets.GenericViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer


class ProductReportViewSet(viewsets.ViewSet):
    queryset = ProductReport.objects.all()
    serializer_class = ProductReportSerializer

    def list(self, request, product_pk=None):
        queryset = self.queryset.filter(product=product_pk)
        serializer = ProductReportSerializer(queryset, many=True, context={'request': request})
        return Response(serializer.data)

    def retrieve(self, request, pk=None, product_pk=None):
        queryset = self.queryset.get(pk=pk, product=product_pk)
        serializer = ProductReportSerializer(queryset)
        return Response(serializer.data)

...

# urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
from rest_framework import routers
from rest_framework_nested.routers import SimpleRouter, NestedSimpleRouter
from productreports import views

router = routers.SimpleRouter()
router.register(r'products', views.ProductViewSet)

products_router = NestedSimpleRouter(router, r'products', lookup='product')
products_router.register(r'productreports', views.ProductReportViewSet)


urlpatterns = patterns('',
    url(r'^', include(router.urls)),
    url(r'^', include(products_router.urls)),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
)

Когда я посещаюhttp://localhost:8000/products/1/productreports/ следующиеошибка Показано:

Неправильно настроено в / products / 1 / productreports /
Не удалось разрешить URL-адрес для связи с гиперссылкой, используя имя представления «productreport-detail». Возможно, вы не смогли включить связанную модель в свой API или неправильно настроилиlookup_field атрибут в этом поле.

Есть несколько вещей, в которых я не уверен, правильно ли они настроены:

product = models.ForeignKey('Product', default=1)many=True вserializer = ProductReportSerializer(queryset, many=True, context={'request': request}) ...каждый продукт может иметьмного отчеты о продуктахProductReportSerializer в общемlookup='product' вproducts_router = NestedSimpleRouter(router, r'products', lookup='product')Обновить

Я заметил, что ошибка возникает только когда естьпо крайней мере, один связанныйproductreport длятовар, Еслиproductreports таблица не содержит записи для конкретноготовар тогда ответ API в порядке.

Когда я проверяюserializer вProductReportViewSet#list Я получил:

ProductReportSerializer([
    <ProductReport: ProductReport object>, <ProductReport: ProductReport object>, 
    <ProductReport: ProductReport object>, <ProductReport: ProductReport object>, 
    <ProductReport: ProductReport object>, <ProductReport: ProductReport object>, 

'...(remaining elements truncated)...'], context={'request': <rest_framework.request.Request object>}, many=True):
        url = HyperlinkedIdentityField(view_name='productreport-detail')
        product = ProductSerializer():
            url = HyperlinkedIdentityField(view_name='product-detail')
            created_at = DateTimeField(read_only=True)
        user_name = CharField(max_length=256)
        created_at = DateTimeField(read_only=True)

Ответы на вопрос(0)

Ваш ответ на вопрос