3

我有以下的模型,我想序列化通过REST暴露:Django的REST框架序列化ForeignKey的和ManyToManyFields

class RehabilitationSession(models.Model): 

    patient = models.ForeignKey('userprofiles.PatientProfile', null=True, blank=True,verbose_name='Paciente', related_name='patientprofile') 

    slug = models.SlugField(max_length=100, blank=True) 

    medical = models.ForeignKey('userprofiles.MedicalProfile', null=True, blank=True, 
         verbose_name='Médico tratante') 
    therapist = models.ForeignKey('userprofiles.TherapistProfile', null=True, blank=True, verbose_name='Terapeuta') 

    date_session_begin = models.DateTimeField(default=timezone.now(), verbose_name = 'Fecha de inicio') 

    upper_extremity = MultiSelectField(
     max_length=255, 
     choices=EXTREMITY_CHOICES, 
     blank=False, 
     verbose_name='Extremidad Superior' 
    ) 

    affected_segment = models.ManyToManyField(AffectedSegment,verbose_name='Segmento afectado') 

    movement = ChainedManyToManyField(
     Movement, #Modelo encadenado 
     chained_field = 'affected_segment', 
     chained_model_field = 'corporal_segment_associated', 
     verbose_name='Movimiento' 
    ) 

    metrics = models.ManyToManyField(Metric, blank=True, verbose_name='Métrica') 
    date_session_end = models.DateTimeField(default=timezone.now(),  verbose_name = 'Fecha de finalización') 
    period = models.CharField(max_length=25,blank=True, verbose_name='Tiempo de duración de la sesión') 

    class Meta: 
     verbose_name = 'Sesiones de Rehabilitación' 

    def __str__(self): 
     return "%s" % self.patient 

要序列这是外键的字段我读this documentation

我的串行的.py是这样的:

from .models import RehabilitationSession 
from rest_framework import serializers 

class RehabilitationSessionSerializer(serializers.HyperlinkedModelSerializer): 

    patient = serializers.HyperlinkedIdentityField(view_name='patientprofile',) 

    class Meta: 
     model = RehabilitationSession 
     fields = ('url','id','patient', 
       'date_session_begin','status','upper_extremity', 

       'date_session_end', 'period','games','game_levels', 
       'iterations','observations',) 

我使用HyperlinkedIdentityField,由于我的模型是序列化与HyperlinkedModelSerializer b UT,我没有明确的或者我还是不理我应该如何序列化时,一个字段是ForeignKeyManyToManyField

urls.py主文件,其中包括我的路线对设置的API网址的是:

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

from .views import home, home_files 

# REST Framework packages 
from rest_framework import routers 
from userprofiles.views import UserViewSet, GroupViewSet, PatientProfileViewSet 
from medical_encounter_information.views import RehabilitationSessionViewSet 

router = routers.DefaultRouter() 
router.register(r'users', UserViewSet) 
router.register(r'groups', GroupViewSet) 
router.register(r'rehabilitation-session', RehabilitationSessionViewSet) 
router.register(r'patientprofile', PatientProfileViewSet) 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 

    url(r'^chaining/', include('smart_selects.urls')), 

    url(r'^$', home, name='home'), 

    url(r'^', include('userprofiles.urls')), 
    #Call the userprofiles/urls.py 

    url(r'^', include('medical_encounter_information.urls')), 
    #Call the medical_encounter_information/urls.py 

    # which is a regular expression that takes the desired urls and passes as an argument 
    # the filename, i.e. robots.txt or humans.txt. 
    url(r'^(?P<filename>(robots.txt)|(humans.txt))$', 
     home_files, name='home-files'), 

    #REST Frameworks url's 
    # Wire up our API using automatic URL routing. 
    # Additionally, we include login URLs for the browsable API. 

    url(r'^api/', include(router.urls)), 
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 

] 

当我试图进入我的API休息的网址,我在CLI中得到以下信息:

 File "/home/bgarcial/.virtualenvs/neurorehabilitation_projects_dev/lib/python3.4/site-packages/rest_framework/relations.py", line 355, in to_representation 
    raise ImproperlyConfigured(msg % self.view_name) 
django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "patientprofile". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field. 
[08/Mar/2016 16:05:45] "GET /api/rehabilitation-session/ HTTP/1.1" 500 165647 

而且在浏览器中我得到这个:

enter image description here

如何能序列化发生在我身上的ForeignKey和ManyToManyField相同的情况? 问候

回答

2

试着改变你的序列化

class RehabilitationSessionSerializer(serializers.HyperlinkedModelSerializer): 

    patient = serializers.HyperlinkedIdentityField(view_name='patientprofile-detail',) 

    class Meta: 
     ... 

路由器会自动创建一个detail视图具有此名称为ViewSet。对于参数view_namedocs

view_name - 应该被用作关系的目标视图名称。如果您使用标准路由器类,则这将是格式为<model_name>-detail的字符串。