2017-09-05 2 views
0

Ich versuche, eine SQL-Abfrage über Django ORM zu tun:Multiply Zwischen zwei Spalten und Gruppen von

SELECT SUM(((BUY_UNITS*BUY_NAV)-(SELL_UNITS*SELL_NAV))) AS NET_CAP, PRODUCT FROM TRADING_DB.OPEN_MUTUAL_FUND_POSITIONS 
GROUP BY PRODUCT; 

Also zunächst i ich habe so etwas wie dies:

MutualFundPositions.objects.filter(client_id=X1234).annotate(net_cap=Sum(("buy_units" * "buy_nav") - ("sell_units" * "sell_nav"))).values('product', 'net_cap') 

nicht funktioniert hat, so versuchte ich es mit F in django zu tun,

MutualFundPositions.objects.filter(client_id=X1234).annotate(net_cap = F(F('buy_units') * F('buy_nav')) - F('sell_units') * F('sell_nav')).values('product', 'net_cap') 

AttributeError at /client/details/capital/ 'CombinedExpression' object has no attribute 'split'

Models.py:

class MutualFundPositions(models.Model): 
    client_id = models.CharField(db_column='CLIENT_ID', max_length=45, primary_key=True) 
    mf_name = models.CharField(db_column='MF_NAME', max_length=100) 
    buy_units = models.DecimalField(db_column='BUY_UNITS', max_digits=10, decimal_places=5) 
    buy_nav = models.DecimalField(db_column='BUY_NAV', max_digits=10, decimal_places=5) 
    sell_units = models.DecimalField(db_column='SELL_UNITS', max_digits=10, decimal_places=5) 
    sell_nav = models.DecimalField(db_column='SELL_NAV', max_digits=10, decimal_places=5) 
    current_nav = models.DecimalField(db_column='CURRENT_NAV', max_digits=10, decimal_places=5) 
    product = models.CharField(db_column='PRODUCT', max_length=45, blank=True, null=True) 
    date = models.DateField(db_column='DATE', blank=True, null=True) 

    class Meta: 
     db_table = 'OPEN_MUTUAL_FUND_POSITIONS' 

serializer.py:

class MutualFundSerializer(serializers.ModelSerializer): 
    pandl = serializers.SerializerMethodField() 

    class Meta: 
     model = MutualFundPositions 
     fields = ['mf_name', 'product', 'buy_units', 'buy_nav', 'sell_units', 'sell_nav', 'pandl','current_nav', 'date'] 

    def get_pandl(self, instance): 
     net_qty = abs(instance.buy_units - instance.sell_units) 
     net_nav = instance.current_nav - instance.buy_nav 
     return net_qty * net_nav 

Was mache ich falsch hier?

Antwort

0

Sie eine ExpressionWrapper können diese

from django.db.models import ExpressionWrapper, F, FloatField 

MutualFundPositions.objects.filter(
    client_id=X1234 
).values(
    'product' 
)annotate(
    net_cap=Sum(
     ExpressionWrapper(
      ExpressionWrapper(F('buy_units') * F('buy_nav'), 
           output_field=FloatField()) - \ 
      ExpressionWrapper(F('sell_units') * F('sell_nav'), 
           output_field=FloatField()), 
      output_field=FloatField(), 
     ), 
) 

Jeder mathematische Operation unter einer ExpressionWrapper gewickelt zu erreichen, daher sind wir drei von ihnen mit: zwei Multiplikationen und eine Subtraktion

Verwandte Themen