如何在Django中执行嵌套序列化?

时间:2015-04-13 01:19:36

标签: django python-2.7 django-models

我是Django的新手。我正在使用Django REST Framework,我需要以下列格式从序列化器中获取json:

 {
    "result"      : 200,
    "categories"    : [{
        "id"  : "V001",
        "name": "Vehicles",
        "description": "All types of motor and non-motor vehicles",
        "icon": "http://images.maa.ae/static/icons/vehicles.png",
        "subcategories": [{
            "id"  : "V00101",
            "name": "Cars",
            "description": "Motor Cars",
            "subcategories": [{
                "id"  : "V0010101",
                "name": "Passenger Cars",
                "description": "All types of passenger cars"
            }]
        },
        {
            "id"  : "V00102",
            "name": "Bikes",
            "description": "Bikes",
            "subcategories": [{
                "id"  : "V0010201",
                "name": "Motor Bikes",
                "description": "All kinds of motor bikes"
            },
            {
                "id"  : "V0010202",
                "name": "Sports Bikes",
                "description": "All kinds of sports bikes"
            }]
        }]
    }]
}

我的模型类是:

class Category(models.Model):
    _id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=128)
    description = models.CharField(max_length=150,null=True, blank=True)
    icon = models.ImageField(upload_to='icons',null=True, blank=True)
    parent_id = models.ForeignKey('self', null=True, blank=True)

我的序列化程序类是:

class CategorySerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Category
        fields = ('_id', 'name', 'description', 'icon')

从上面的实现中,我可以获得JSON格式的Array对象数组。

但我不知道如何在序列化程序类中包含“子类别”。请帮助我获得类似于以上格式所示的json的输出。

3 个答案:

答案 0 :(得分:0)

使用Django Rest Framework。

http://www.django-rest-framework.org/

保持代码干净

from rest_framework import serializers

class CategoriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Categories

浏览

 from rest_framework import viewsets

 from .serializers import CategoriesSerializer

 class CategoryViewSet(viewsets.ModelViewSet):
     queryset = Categories.objects.all()
     serializer_class = CategoriesSerializer

实施例

models.py:

class Sprints(models.Model):
    name = models.CharField(default='', blank=True, max_length=90)
    description = models.TextField(default='')


class Tasks(models.Model):
    date_posted = models.DateTimeField(auto_now_add=True)
    name = models.CharField(default='', blank=True, max_length=90)
    end = models.DateTimeField(null=True, blank=True)
    sprint = models.ForeignKey(Sprints, related_name='tasks')

    class Meta:
        ordering = ['-date_posted']
        unique_together = ['name', 'sprint']

serializers.py:

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tasks
        fields = ('id', 'name', 'date_posted', 'end')

class SprintSerializer(serializers.ModelSerializer):
    tasks = TaskSerializer(many=True, read_only=True)

    class Meta:
        model = Sprints
        fields = ('id', 'name', 'description', 'tasks')

views.py

class SprintsViews(viewset.ModelViewSet):
    queryset = Sprints.objects.all()
    serializer_class = SprintSerializer

您还可以向模型添加一个slug字段,以便更容易处理,但现在就是这样:)

答案 1 :(得分:0)

您应该考虑查看THISdepth 元属性的使用使您能够检索到您设置的深度的相关对象。

通过这样做,它会自动检索嵌套数据。

很方便,可以避免两边都使用serializer,也避免循环引起的ImportError。

答案 2 :(得分:0)

related_name 文件中的 on_delete 字段中使用 parent_idmodels.py

class Category(models.Model):
    _id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=128)
    description = models.CharField(max_length=150,null=True, blank=True)
    icon = models.ImageField(upload_to='icons',null=True, blank=True)
    parent_id = models.ForeignKey('self', null=True, blank=True, related_name='children', on_delete=models.CASCADE)

现在在您的项目中添加包 pip install djangorestframework-recursive

serializers.py

##################################
from rest_framework_recursive.fields import RecursiveField
##################################

class CategorySerializer(serializers.ModelSerializer):
    children = RecursiveField(many=True)
    class Meta:
        model = Category
        fields = ('_id', 'name', 'description', 'icon', 'parent_id', 'children')

views.py(序列化程序视图文件):

class CategoryListAPIView(generics.ListAPIView):
    serializer_class = CategorySerializer
    queryset = Category.objects.filter(parent_id__isnull=True)

urls.py

############################
############################

urlpatterns = [
    path('category/', views.CategoryListAPIView.as_view(), name="categoryAPI"),
    ######################################
]