Набор запросов Django к объекту JSON, вложенному по первичному ключу - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь проанализировать набор запросов в объект JSON, чтобы каждый ключ был первичным ключом модели, а каждое значение - объектом JSON, содержащим все остальные поля.

myjson = {
           apple:  { color: "r", calories: 10},
           banana: { color: "w", calories: 50}
​         }

Здесьэто модель и представление Django, собирающее данные (на основе этого сообщения в блоге ):

class Fruit(models.Model):
    fruit_id = models.CharField(primary_key=True)
    color = models.CharField(max_length=50)
    calories = models.IntegerField()

def get_FruitsTableDjango(request):
    fruits_table = Fruit.objects.all().values()
    fruits_table_list = list(fruits_table )  # important: convert the QuerySet to a list object
    return JsonResponse(fruits_table_list , safe=False)

Но на стороне клиента (через AJAX) это возвращает массив объектов:

mydata = [
           0: { fruit_id: "apple", color: "r", calories: 10},
           1: { fruit_id: "banana", color: "w", calories: 50}
]

Я также нашел здесь , как я могу переработать этот массив, как и ожидалось:

//Restructure JSON by fruit_id name
fruits= {},
mydata.forEach(function (a) {
    var temp = {};
    Object.keys(a).forEach(function (k) {
        if (k === 'fruit_id') {
            fruits[a[k]] = temp; //gets fruit_id
            return;
        }
        temp[k] = a[k]; //fill the temp variable with elements
    });
});
mydata=fruits; //overwrite initial array with nicely-rearranged-by-fruitId object

У меня два основных вопроса:

  1. Есть ли более прямой способ получить желаемый JSON (вложенный первичными ключами)?
  2. Если нет, то где объективно лучшее место для выполнения логики синтаксического анализа объекта: на стороне клиента в Javascript (например,выше) или на стороне сервера, например, в представлении Django?

1 Ответ

0 голосов
/ 16 марта 2019

В DRF,

Допустим, у меня есть model.py как показано ниже

from django.db import models


class OrganisationalUnitGrouper(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

    @property
    def unit(self):
        return self.organisationalunit_set.all()


class OrganisationalUnit(models.Model):
    unit_id = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    display = models.CharField(max_length=255)
    description = models.CharField(max_length=255)
    path = models.CharField(max_length=255)
    ou_group = models.ForeignKey(OrganisationalUnitGrouper, on_delete=models.PROTECT)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "OU Unit"

Сериализатор, который вы можете определить как

from rest_framework import serializers

from .models import OrganisationalUnitGrouper, OrganisationalUnit


class OUSerializer(serializers.ModelSerializer):
    # id = serializers.IntegerField(required=False)

    class Meta:
        model = OrganisationalUnit
        fields = ("unit_id", "name", "display", "description", "path")


class OUGroupSerializer(serializers.ModelSerializer):
    unit = OUSerializer(many=True)

    class Meta:
        model = OrganisationalUnitGrouper
        fields = ("name", "unit")

И viewset может быть

from rest_framework import viewsets

from .serializers import OUSerializer, OUGroupSerializer
from .models import OrganisationalUnitGrouper, OrganisationalUnit


class OUGroupViewSet(viewsets.ModelViewSet):

    queryset = OrganisationalUnitGrouper.objects.all()
    serializer_class = OUGroupSerializer


class OUViewSet(viewsets.ModelViewSet):

    queryset = OrganisationalUnit.objects.all()
    serializer_class = OUSerializer

Это даст вам вложенный API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...