2016-06-15 23 views
3

Ich verwende derzeit die Standard-CRUD-Operationen von Django-Rest-Framework zur Verfügung gestellt. Es funktioniert gut mit normalen Modellen, aber eines meiner Modelle hat viele-viele Beziehungen zu einem anderen Tag-Modell. Hier ist der Code für die ModelleManyToMany mit Django Rest Framework

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 

Was ich möchte wissen, ist, was die beste Methode ist DRF mit derselben zu integrieren, wenn möglich, ohne dass alle CRUD-Operationen von Grund auf neu zu schreiben.

+1

Da Sie erwähnt haben, dass Sie DRF verwenden, gehe ich davon aus, dass Sie auch 'ModelSerializer' verwenden. Wenn das der Fall ist, könnten Sie erwähnen, was das Problem zu sein scheint? – r3ign

+0

Mögliches Duplikat von [django restframework - Serializer zum Erstellen von m2m-Beziehung] (http://stackoverflow.com/questions/25759689/django-restframework-serializer-for-creating-m2m-relationship) – r3ign

+0

danke @ r3ign, das Duplikat sollte in der Lage zu lösen, ich denke, werde versuchen, dass :) – georoot

Antwort

4

In Ihrem 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') 

in Ihrem 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 

und in Ihrem 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) 

auch sicherstellen, dass die restframework Urls wie enthalten sind beschrieben in Dok.

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

) 
+1

Erstellen von Aktivität und Tags sind alle in Ordnung, aber was ist mit der Verknüpfung der Tags zu Aktivität, habe ich festgestellt, dass Sie das nur in Serialisierung – georoot

+1

Drf erfordert spezielle Sachen für viele Beziehungen und verschachtelte Strukturen .. sehen Sie sich die Relationen von Docs Serializern an – Dennis

Verwandte Themen