Доступ к объектам из другой модели - Django - PullRequest
0 голосов
/ 03 августа 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 IndexData(models.Model):
    index = models.ForeignKey(IndexMaster, on_delete=models.CASCADE)
    lifetime_high = models.FloatField()
    lifetime_low = models.FloatField()
    yearly_high = models.FloatField()
    yearly_low = models.FloatField()
    yesterdays_close = models.FloatField()
    day_high = models.FloatField()
    day_low = models.FloatField()
    todays_open = models.FloatField()
    lastvalue = models.FloatField()
    change = models.FloatField()
    percentchange = models.FloatField()


    class Meta:
        managed = True
        db_table = 'index_data'

Мой serialiser.py выглядит так

from rest_framework import serializers

from .models import IndexData

class IndexSerializer(serializers.ModelSerializer):

    class Meta:

        model = IndexData
        fields = ['index' ,'day_high', 'day_low', 'lastvalue', 'change', 'percentchange']

    def to_representation(self, instance):
        ret = super(IndexSerializer, self).to_representation(instance)

        return ret

, а views.py похож на

class IndexList(generics.ListAPIView):
    queryset = IndexData.objects.all()

    serializer_class = IndexSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

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

        Q1 = Q(index_id = indexID)

        return IndexData.objects.filter(Q1)

проблема в том, что когда я нажимаю URL-адрес для получения JSON, я получаю следующий ответ:

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

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "index": 3.0,
            "day_high": 8867.2,
            "day_low": 8725.25,
            "lastvalue": 8746.85,
            "change": -97.95,
            "percentchange": -1.1
        }
    ]
}

я хочу включить index_name, index_on и index_type из модели IndexMaster .. Как мне этого добиться? Мне нужен ответ JSON:

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

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "index": 3.0,
            "index_name": "XXXX",
            "index_on": "XXXX",
            "index_type": "XXXX",
            "day_high": 8867.2,
            "day_low": 8725.25,
            "lastvalue": 8746.85,
            "change": -97.95,
            "percentchange": -1.1
        }
    ]
}

, где XXXX заменяется фактическими значениями, поступающими из IndexMaster

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Вы можете добавить их следующим образом (используя source):

class IndexSerializer(serializers.ModelSerializer):
      index_on = serializers.CharField(source="index.index_on")
      index_name = serializers.CharField(source="index.index_name")
      index_type = serializers.CharField(source="index.index_type")

    class Meta:
        model = IndexData
        fields = ['index', 'index_name', 'index_on', 'index_type' ,'day_high', 'day_low', 'lastvalue', 'change', 'percentchange']
0 голосов
/ 03 августа 2020

вы можете создать сериализатор моделей отношений следующим образом:

class IndexMasterSerializer(serializers.ModelSerializer):
      class Meta:
            model = IndexMaster
            fields = '__all__'

class IndexSerializer(serializers.ModelSerializer):
      index = IndexMasterSerializer() # you indicat the field "index" need to be serializer by IndexMasterSerializer
    class Meta:
        model = IndexData
        fields = ['index' ,'day_high', 'day_low', 'lastvalue', 'change', 'percentchange']

результаты будут выглядеть так:

"results": [
    {
        "index": {
            "index_id": "XXXXX",
            "index_name": "XXXX",
            "index_on": "XXXX",
            "index_type": "XXXX"
        },
        "day_high": 8867.2,
        "day_low": 8725.25,
        "lastvalue": 8746.85,
        "change": -97.95,
        "percentchange": -1.1
    }
  ]
...