2017-02-06 1 views
1

Я новичок в Django Rest Framework и изо всех сил стараюсь, чтобы мои сериализаторы работали правильно для отношений между двумя двумя моделями. Я попытался уменьшить мою настройку настолько, насколько это возможно, но я все еще не могу понять, как она должна работать. Я пытаюсь использовать HyperlinkedModelSerializer так (от docs), «что он использует гиперссылки для представления отношений». Когда я пытаюсь посетить URL для либо списка или Детальный вид для {модели X} на тестовом сервере, я получаю:Как сделать HyperlinkedModelSerializer в Django Rest Framework работать для иностранных ключей?

«Не удалось разрешить URL для гипертекстовых отношений, используя имя вида «{модель Y} - деталь». Возможно, вы не смогли включить связанную модель в свой API или неправильно настроили атрибут lookup_field на это поле. '

Что я делаю неправильно?

Мои модели:

from django.db import models 


class Project(models.Model): 
    name = models.CharField(max_length=50) 
    description = models.TextField() 


class ProjectPhoto(models.Model): 
    project = models.ForeignKey(
      Project, related_name='photos', on_delete=models.CASCADE 
     ) 
    image = models.ImageField() 
    caption = models.CharField(max_length=100) 
    date_added = models.DateTimeField(auto_now_add=True) 

Мои сериализаторов

class ProjectSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Project 
     fields = ('name', 'description', 'photos') 


class ProjectPhotoSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = ProjectPhoto 
     fields = ('image', 'caption', 'date_added', 'project')) 

Мои взгляды:

from rest_framework import viewsets 

from projects.models import Project, ProjectPhoto 
from projects.serializers import ProjectSerializer, ProjectPhotoSerializer 


class ProjectViewSet(viewsets.ModelViewSet): 
    queryset = Project.objects.all().order_by('name') 
    serializer_class = ProjectSerializer 


class ProjectPhotoViewSet(viewsets.ModelViewSet): 
    queryset = ProjectPhoto.objects.all().order_by('date_added') 
    serializer_class = ProjectPhotoSerializer 

EDIT:

Мой URL s:

from django.conf.urls import url, include 
from rest_framework import routers 

from projects import views 


router = routers.DefaultRouter() 
router.register(r'^projects', views.ProjectViewSet) 
router.register(r'^project-photos', views.ProjectPhotoViewSet) 

urlpatterns = [ 
     url(r'^', include(router.urls)), 
    ] 

они затем добавляются в мой основной файл urls.py приложения. Я не думаю, что это проблема, как если бы я изменил сериализатор на ModelSerializer, тогда все будет хорошо.

+0

где ист ваш urls.py? Вы должны иметь оба вида, подключенные к вашему маршрутизатору URL. –

+0

Спасибо за быстрый комментарий. Я добавил файл urls, хотя думаю, что проблема, вероятно, не существует (см. Править) – lac

+1

Я не думаю, что вы должны иметь эти '^' в префиксах маршрута. По крайней мере, это не в документах. 'router.register ('foo', views.FooViewSet)' http://www.django-rest-framework.org/api-guide/routers/ –

ответ

3

я думаю, ваша проблема ИТС в файле urls.py см код и изображение

отдыха/urls.py файл

from django.conf.urls import url, include 
from rest_framework import routers 

from .views import ProjectViewSet, ProjectPhotoViewSet 

router = routers.SimpleRouter() 
router.register(r'project', ProjectViewSet) 
router.register(r'project-photo', ProjectPhotoViewSet) 

urlpatterns = [ 
    url(r'^', include(router.urls)), 
] 

Основной urls.py файл:

from django.conf.urls import url, include 
from django.contrib import admin 

from rest import urls as urls_rest 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^rest/', include(urls_rest)), 
] 

enter image description here

и другие варианты, попробуйте использовать этот код в вашем serializers.p у файла:

from rest_framework import serializers 


from .models import Project, ProjectPhoto 


class ProjectPhotoSerializer(serializers.ModelSerializer): 

    class Meta: 
    model = ProjectPhoto 
    fields = ('image', 'caption', 'date_added', 'project') 


class ProjectSerializer(serializers.ModelSerializer): 

    class Meta: 
    model = Project 
    fields = ('name', 'description', 'photos') 
    depth = 2 

У вас есть 3 варианта использования сериализаторы (см рисунок ниже) enter image description here

+0

Большое спасибо, я удалил '^' s, и он работает.Можете ли вы объяснить, почему он ранее работал с «ModelSerializer», но не с «HyperlinkedModelSerializer»? – lac

+0

Просмотреть новое править –

Смежные вопросы