Django 将两个不同的序列化程序合并到一个视图中,返回命名JSON数组

Django 将两个不同的序列化程序合并到一个视图中,返回命名JSON数组,django,django-rest-framework,Django,Django Rest Framework,我需要将两个视图合并为一个视图 最终的组合响应应如下所示: { "**EQUITY**": [{ "SYMBOL": "INFY", "BUY_QTY": 10, "BUY_RATE": 1010.01 }, { "SYMBOL": "TCS", "BUY_QTY": 10, "BUY_RATE": 1010.01 }, { "SYMBOL": "MARUTI"

我需要将两个视图合并为一个视图

最终的组合响应应如下所示:

{
    "**EQUITY**": [{
        "SYMBOL": "INFY",
        "BUY_QTY": 10,
        "BUY_RATE": 1010.01
    }, {
        "SYMBOL": "TCS",
        "BUY_QTY": 10,
        "BUY_RATE": 1010.01
    }, {
        "SYMBOL": "MARUTI",
        "BUY_QTY": 10,
        "BUY_RATE": 1010.01
    }],
    "**FNO**": {
        "**OPTIONS**": [{
            "SYMBOL": "INFY",
            "EXPIRY_DATE": "2017-07-18",
            "STRIKE": 1200,
            "OPT_TYPE": "CE",
            "BUY_QTY": 10,
            "BUY_RATE": 1010.01,
            "SELL_QTY": 0,
            "SELL_RATE": 0,
            "DIRECTION": "LONG"
        }, {
            "SYMBOL": "NIFTY",
            "EXPIRY_DATE": "2017-07-18",
            "STRIKE": 9200,
            "OPT_TYPE": "PE",
            "BUY_QTY": 10,
            "BUY_RATE": 1010.01,
            "SELL_QTY": 0,
            "SELL_RATE": 0,
            "DIRECTION": "SHORT"
        }],
        "**FUTURES**": [{
            "SYMBOL": "INFY",
            "EXPIRY_DATE": "2017-07-18",
            "BUY_QTY": 10,
            "BUY_RATE": 1010.01,
            "SELL_QTY": 0,
            "SELL_RATE": 0,
            "DIRECTION": "LONG"
        }, {
            "SYMBOL": "NIFTY",
            "EXPIRY_DATE": "2017-07-18",
            "BUY_QTY": 10,
            "BUY_RATE": 1010.01,
            "SELL_QTY": 0,
            "SELL_RATE": 0,
            "DIRECTION": "SHORT"
        }]
    }
}
最初,我将其分为两个独立的端点,但现在的要求是两个序列化程序响应都应该在一个视图中。如何将这两个序列化程序合并到一个视图中

这是我的观点。py

from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAuthenticated
from .serializers import *
from .models import EquityPositions


class EquityPositionListView(ListAPIView):
    serializer_class = EquityPositionSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        print("logged in user ==== >", self.request.user.username)
        return EquityPositions.objects.using('tradingdb').filter(client_id=self.request.user.username, status="OPEN")


class FnoPositionListView(ListAPIView):
        serializer_class = FnoPositionsSerializer
        permission_classes = [IsAuthenticated]

        def get_queryset(self):
            print("logged in user ==== >", self.request.user.username)
            return FnoPositions.objects.using('tradingdb').filter(client_id=self.request.user.username)
from rest_framework import serializers
from .models import *

class EquityPositionSerializer(serializers.ModelSerializer):
    net_qty = serializers.SerializerMethodField()

    class Meta:
        model = EquityPositions
        fields = ['net_qty', 'symbol', 'buy_qty', 'buy_rate']

    def get_net_qty(self, instance):
        return instance.buy_qty - instance.sell_qty


class FnoPositionsSerializer(serializers.ModelSerializer):
    net_qty = serializers.SerializerMethodField()

    class Meta:
        model = FnoPositions
        fields = ['net_qty','symbol','expiry_date','strike_price','buy_qty','sell_qty','direction']

    def get_net_qty(self, instance):
        return abs(instance.sell_qty - instance.buy_qty)
这是我的序列化程序。py

from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAuthenticated
from .serializers import *
from .models import EquityPositions


class EquityPositionListView(ListAPIView):
    serializer_class = EquityPositionSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        print("logged in user ==== >", self.request.user.username)
        return EquityPositions.objects.using('tradingdb').filter(client_id=self.request.user.username, status="OPEN")


class FnoPositionListView(ListAPIView):
        serializer_class = FnoPositionsSerializer
        permission_classes = [IsAuthenticated]

        def get_queryset(self):
            print("logged in user ==== >", self.request.user.username)
            return FnoPositions.objects.using('tradingdb').filter(client_id=self.request.user.username)
from rest_framework import serializers
from .models import *

class EquityPositionSerializer(serializers.ModelSerializer):
    net_qty = serializers.SerializerMethodField()

    class Meta:
        model = EquityPositions
        fields = ['net_qty', 'symbol', 'buy_qty', 'buy_rate']

    def get_net_qty(self, instance):
        return instance.buy_qty - instance.sell_qty


class FnoPositionsSerializer(serializers.ModelSerializer):
    net_qty = serializers.SerializerMethodField()

    class Meta:
        model = FnoPositions
        fields = ['net_qty','symbol','expiry_date','strike_price','buy_qty','sell_qty','direction']

    def get_net_qty(self, instance):
        return abs(instance.sell_qty - instance.buy_qty)
以下是我的模型:

class EquityPositions(models.Model):
    pos_id = models.AutoField(db_column='POS_ID', primary_key=True)
    client_id = models.CharField(db_column='CLIENT_ID', max_length=25)
    symbol = models.CharField(db_column='SYMBOL', max_length=100)
    buy_qty = models.IntegerField(db_column='BUY_QTY', blank=True, null=True)
    buy_rate = models.DecimalField(db_column='BUY_RATE', max_digits=15, decimal_places=2, blank=True, null=True)
    sell_qty = models.IntegerField(db_column='SELL_QTY', blank=True, null=True)
    sell_rate = models.DecimalField(db_column='SELL_RATE', max_digits=10, decimal_places=2, blank=True, null=True)
    pandl = models.DecimalField(db_column='PANDL', max_digits=10, decimal_places=2, blank=True, null=True)
    status = models.CharField(db_column='STATUS', max_length=10)
    tax = models.DecimalField(db_column='TAX', max_digits=10, decimal_places=2)
    brokrage = models.DecimalField(db_column='BROKRAGE', max_digits=10, decimal_places=2)
    product = models.CharField(db_column='PRODUCT', max_length=45, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'EQUITY_POSITIONS'


class FnoPositions(models.Model):
    pos_id = models.AutoField(db_column='POS_ID', primary_key=True)
    client_id = models.CharField(db_column='CLIENT_ID', max_length=25)
    symbol = models.CharField(db_column='SYMBOL', max_length=100)
    instrument = models.CharField(db_column='INSTRUMENT', max_length=20)
    expiry_date = models.DateField(db_column='EXPIRY_DATE')
    strike_price = models.DecimalField(db_column='STRIKE_PRICE', max_digits=20, decimal_places=4, blank=True, null=True)
    option_type = models.CharField(db_column='OPTION_TYPE', max_length=5, blank=True, null=True)
    buy_qty = models.IntegerField(db_column='BUY_QTY')
    buy_rate = models.DecimalField(db_column='BUY_RATE', max_digits=20, decimal_places=4)
    sell_qty = models.IntegerField(db_column='SELL_QTY')
    sell_rate = models.DecimalField(db_column='SELL_RATE', max_digits=20, decimal_places=4)
    pandl = models.DecimalField(db_column='PANDL', max_digits=20, decimal_places=4)
    direction = models.CharField(db_column='DIRECTION', max_length=10)
    status = models.CharField(db_column='STATUS', max_length=10)
    brokerage = models.DecimalField(db_column='BROKERAGE', max_digits=20, decimal_places=4)
    tax = models.DecimalField(db_column='TAX', max_digits=20, decimal_places=4)
    product = models.CharField(db_column='PRODUCT', max_length=45, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'FNO_POSITIONS'

可以替代新视图的列表方法:


你能展示你的模型吗??如果没有这两种型号之间的关系,我们对你就帮不了什么忙@zaidfazil根据您的要求,我已将模型包括在我的问题中。感谢您抽出时间撰写此答案,我认为我们正在接近解决方案。我试了一下你的建议,结果犯了这个错误。断言错误:当向序列化程序传递
数据
关键字参数时,在尝试访问序列化的
数据
表示之前,必须调用
.is\u valid()
。你应该先调用
.is\u valid()
,或者访问
.initial\u data
。抱歉,删除了我在回答中修复的数据关键字。我调试了它,它终于工作了!非常感谢你bro:)我所需要做的就是在返回响应之前添加两行``equity.is\u valid()fno.is\u valid()```以便它可以验证序列化的数据除了is valid操作之外,尝试新版本只需删除datakeyword ror示例
fno=self.serializer\u class\u fno(self.get\u queryset\u fno(),many=True)
很高兴能帮助您)