【问题标题】:Serialize of 1+n objects from 2 models, that do not have relationships序列化来自 2 个模型的 1+n 个对象,它们没有关系
【发布时间】:2018-03-12 12:31:46
【问题描述】:

我在 2 个不同的应用程序中有 2 个模块它们没有任何关系

class Table(models.Model):
    name = models.CharField(max_length=32, unique=True)
    columns = JSONField()

class Company(models.Model):
    name = models.CharField(max_length=32, unique=True)

我需要创建序列化器,首先只序列化 1 个特定的 Table 对象(始终相同)。例如,它必须是 Table.obejects.get(id=1)。然后我根据我在下面发布的 View 功能中的内容对 Company 进行序列化。

那个场景很重要,因为在Table中我解释了如何建表,而在Company我得到了数据,我会放到预建表中.

公司的序列化程序类:

class CompanySerializer(serializers.ModelSerializer):
    class Meta:
        model = Company
        fields = ('name',)

查看公司的类:

class CompanyList(APIView):
    def get_queryset(self):
        return Company.objects.all()

    def get(self, request, format=None):
        companies = self.get_queryset()
        serializer = CompanySerializer(companies, many=True)
        return Response(serializer.data)

【问题讨论】:

    标签: django python-3.x serialization django-rest-framework


    【解决方案1】:

    您可以创建单独的TableSerializer:

    class TableSerializer(serializers.ModelSerializer):
        class Meta:
            model = Table
            fields = ('name',)
    

    并在CompanySerializerSerializerMethodField 中使用它:

    class CompanySerializer(serializers.ModelSerializer):
        table = SerializerMethodField()
        class Meta:
            model = Company
            fields = ('name',)
    
        def get_table(self, obj):
            table = self.context['table']
            return TableSerializer(table).data 
    

    鉴于您需要将table添加到序列化程序context

    class CompanyList(APIView):
        def get_queryset(self):
            return Company.objects.all()
    
        def get(self, request, format=None):
            companies = self.get_queryset()
            table = Table.obejects.get(id=1)
            serializer = CompanySerializer(companies, many=True, context={'table': table})
            return Response(serializer.data)
    

    【讨论】:

    • 谢谢,它有效。唯一的问题是它在每个 Company 对象中重复来自“表”的数据。但没有必要这样做。表假设一开始只序列化 1 次,以向 UI 展示如何构建表。
    【解决方案2】:

    答案是在一个响应中合并 2 个单独的序列化

    为此,您需要准备 2 个序列化程序:

    class CompanySerializer(serializers.ModelSerializer):
        class Meta:
            model = Company
            fields = ('name',)
    
    class TableSerializer(serializers.ModelSerializer):
        class Meta:
            model = Table
            fields = ('columns',)
    

    然后响应他们作为列表:

    class CompanyList(APIView):
        def get_queryset(self):
            return Company.objects.all()
    
        def get(self, request, format=None):
            companies = self.get_queryset()
            company_serializer = CompanySerializer(companies, many=True)
            table_serializer = TableSerializer(Table.objects.get(name='customers.company'))
    
            return Response([table_serializer.data, company_serializer.data])
    

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 2017-08-25
      • 2020-05-20
      • 2020-08-15
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多