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)
很高兴能帮助您)