【问题标题】:How to perform nested serialization in Django?如何在 Django 中执行嵌套序列化?
【发布时间】:2015-06-18 05:55:45
【问题描述】:

我是 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 格式的 Category 对象数组。

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

【问题讨论】:

  • 您的问题到底是什么?如何从数据库中检索一些东西?如何创建 JSON?请edit您的问题更具体,只有一个问题。此外,请添加您正在使用的代码、您收到的任何错误或回溯的全文,以及对确切问题的详细描述。就目前而言,这个问题还很不清楚。

标签: django python-2.7 django-models


【解决方案1】:

使用 Django Rest 框架。

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 字段以使其更易于处理,但目前是这样 :)

【讨论】:

  • 感谢您的帮助,我正在使用 django-rest 框架。我真正的问题是关于嵌套序列化。我需要在我的回复中包含子类别,如我的问题所示,它属于“类别”类型。
  • 你试过超链接吗? django-rest-framework.org/tutorial/…如果您需要更多帮助,我可以发布我在 scrum 应用程序中使用的具体示例
  • 感谢您的回复,我尝试过超链接关系,由于我是 django 新手,我觉得很难理解。您能提供您的示例吗?
  • 这只是为了以您想要的方式表示,我们可以添加 slug 并做各种事情!现在我推荐这本书“Lightweight-Django”
【解决方案2】:

您应该考虑查看THIS。使用depth 元属性可以让您将相关对象检索到您设置的深度。

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

非常方便,避免两边都使用序列化器,避免循环导致ImportError。

【讨论】:

    【解决方案3】:

    models.py 文件中的parent_id 字段上使用related_nameon_delete

    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"),
        ######################################
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-17
      • 2017-07-12
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多