Django моделей, извлекающих данные из 4 моделей - PullRequest
1 голос
/ 04 августа 2020

У меня есть следующие модели

class IndexMaster(models.Model):
    index_id = models.IntegerField(primary_key=True)
    index_name = models.CharField(max_length=100)
    index_on = models.CharField(max_length=10)
    index_type = models.CharField(max_length=20)

    def __str__(self):
        return self.index_id

    class Meta:
        managed = True
        db_table = 'index_master'


class StockMaster(models.Model):
    stock_id = models.CharField(primary_key=True, max_length=100)
    stock_name = models.CharField(max_length=100)

    class Meta:
        managed = True
        db_table = 'stock_master'

class StockIndexMap(models.Model):
    index = models.ForeignKey(IndexMaster, on_delete=models.CASCADE, related_name= 'StockMaster_StockIndexMap_set')
    stock = models.ForeignKey(StockMaster, to_field ='stock_id', on_delete=models.CASCADE)

    class Meta:
        managed = True
        db_table = 'stock_index_map'
        # unique_together = (('index', 'stock'),)


class StockData(models.Model):
    stock = models.ForeignKey(StockMaster, on_delete=models.CASCADE)
    day_high = models.FloatField()
    day_low = models.FloatField()
    lastvalue = models.FloatField()
    change = models.FloatField()
    percentchange = models.FloatField()

    class Meta:
        managed = True
        db_table = 'stock_data'

serializer.py

from rest_framework import serializers
from .models import IndexMaster,StockIndexMap, StockMaster, StockData
from  indexdata.serializers import IndexMasterSerializer

class StockMasterSerializer(serializers.ModelSerializer):
    # stock = StockIndexMapSerializer()
    class Meta:
        model = StockMaster
        # fields = ['index', 'stock_id', 'stock_name']
        fields = [ 'stock_id', 'stock_name']


class StockIndexMapSerializer(serializers.ModelSerializer):
    # index = IndexMasterSerializer()
    stock = StockMasterSerializer()
    class Meta:
        model = StockIndexMap
        fields = [ 'stock']

class StockDataSerializer(serializers.ModelSerializer):
    stock = StockMasterSerializer()

    class Meta:
        model = StockData
        fields = ['stock','day_high', 'day_low', 'lastvalue', 'change', 'percentchange']

в views.py

class StockMulti(generics.ListAPIView):
queryset = StockIndexMap.objects.all()

serializer_class = StockIndexMapSerializer

pagination_class = CustomPagination
permission_classes = [permissions.IsAuthenticatedOrReadOnly]

def get_queryset(self):
    query_params = self.request.query_params
    indexID = query_params.get('id', None)

    Q1 = Q(index_id = indexID)

    return StockIndexMap.objects.filter(Q1)

Вывод JSON, который я получение

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "links": {
        "next": "http://localhost:8000/stock/topstock?id=1&page=2",
        "previous": null
    },
    "total": 50,
    "page": 1,
    "page_size": 4,
    "results": [
        {
            "stock": {
                "stock_id": "BHRI.NS",
                "stock_name": "BHARTI INFRATEL LTD"
            }
        },
        {
            "stock": {
                "stock_id": "BJAUT IS Equity",
                "stock_name": "BAJAJ AUTO LTD"
            }
        }
    ]
}

то, что я хочу, - это чтобы в элементе stocks также были извлечены данные из модели StockMaster. Поток таков: у меня есть Index Master и Stock Master. Имеются данные о запасах, связанные с основной записью запасов. Затем у меня есть StockIndexMap, который сопоставляет все элементы индекса с соответствующими элементами акций. Я могу получить список акций в индексе, но не могу получить цены на акции. Последний элемент JSON должен выглядеть примерно так:

{
    "stock": {
        "stock_id": "BJAUT IS Equity",
        "stock_name": "BAJAJ AUTO LTD"
        "lastvalue": 999.99
        "change": 99.99
    }
}

Спасибо за вашу помощь

...