Django REST框架序列化ForeignKey和ManyToManyFields

时间:2016-03-08 18:14:38

标签: python django serialization django-models django-rest-framework

我有以下模型,我希望序列化通过REST公开:

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

我的serializers.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序列化的,但我不清楚,或者我仍然忽略如何在一个字段为{{1时序列化}和ForeignKey

我的ManyToManyField主文件中包含用于设置api url的路线:

urls.py

当我尝试访问我的api休息的url时,我在cli中收到以下消息:

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')),

]

在我的浏览器中,我得到了这个:

enter image description here

如何在同一情况下序列化一个ForeignKey和ManyToManyField? 最诚挚的问候

1 个答案:

答案 0 :(得分:2)

尝试将序列化程序更改为

class RehabilitationSessionSerializer(serializers.HyperlinkedModelSerializer):

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

    class Meta:
        ...

路由器会自动使用detail的此名称创建ViewSet视图。有关参数view_name的信息,请参见docs

  

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