manyToMany用django休息框架

geo*_*oot 5 django django-rest-framework

我目前正在使用django-rest-framework提供的默认CRUD操作.它适用于普通模型,但我的模型之一与另一个标签模型有许多关系.这是模型的代码

class ActivityType(models.Model):
    title = models.CharField(max_length=200)
    slug = models.CharField(max_length=250,unique=True)

    def __unicode__(self):
        return self.slug        

class Activity(models.Model):
    owner = models.ForeignKey('auth.user')
    title = models.CharField(max_length=200)
    slug = models.CharField(max_length=250,unique=True)
    description = models.TextField()
    tags = models.ManyToManyField(ActivityType)
    created = models.DateTimeField(auto_now_add=True, blank=True)

    def __unicode__(self):
        return self.slug
Run Code Online (Sandbox Code Playgroud)

我想知道的是,如果可能的话,在没有从头开始编写所有CRUD操作的情况下,将DRF与其集成的最佳方法是什么.

dmi*_*yro 6

在你的serializers.py中

from rest_framework import serializers
from rest_framework import generics

from models import Activity
from models import ActivityType

class ActivityTypeSerializer(serializers.ModelSerializer):

    class Meta:
        model = ActivityType
        fields = ('id', 'title', 'slug')

class ActivitySerializer(serializers.ModelSerializer):

    tags = ActivityTypeSerializer(many=True, read_only=True)

    class Meta:
        model = Activity
        fields = ('id', 'owner', 'title', 'slug', 'description', 'tags', 'created')
Run Code Online (Sandbox Code Playgroud)

在你的views.py中

from rest_framework import viewsets

from serializers import ActivitySerializer
from serializers import ActivityTypeSerializer

from models import Activity
from models import ActivityType

class ActivityViewSet(viewsets.ModelViewSet):
    queryset = Activity.objects.all()
    serializer_class = ActivitySerializer

class ActivityTypeViewSet(viewsets.ModelViewSet):
    queryset = ActivityType.objects.all()
    serializer_class = ActivityTypeSerializer
Run Code Online (Sandbox Code Playgroud)

并在你的urls.py

from rest_framework.urlpatterns import format_suffix_patterns
from rest_framework import routers, serializers, viewsets
from rest_framework import generics
from rest_framework import viewsets, routers  

from your_app.views import ActivityTypeViewSet
from your_app.views import ActivityViewSet

router = routers.DefaultRouter()

router.register(r'activitytypes', ActivityTypeViewSet)  
router.register(r'activities', ActivityViewSet)
Run Code Online (Sandbox Code Playgroud)

还要确保包含restframework网址,如文档中所述

 urlpatterns = patterns('',

 # your other urls 

     url(r'^api/$', include('rest_framework.urls', namespace='rest_framework')),
     url(r'api/accounts/', include('rest_framework.urls', namespace='rest_framework')),

 ) 
Run Code Online (Sandbox Code Playgroud)

  • 创建活动和标签都可以正常工作,但是如何将标签链接到活动呢,我注意到您已经在序列化程序中将其设置为“只读” (2认同)
  • drf 需要一些特殊的东西来处理许多关系和嵌套结构.. 查看文档序列化程序关系 (2认同)