Как я могу получить только один JSON объект с объединенной информацией о трех моделях? - PullRequest
0 голосов
/ 02 апреля 2020

Как я могу передать значения внешнего ключа из моей модели в мой сериализованный объект json?

Теперь у меня есть эти три модели,

class Fleet(models.Model):
    fleet_id = models.IntegerField('Id flota', primary_key=True, unique=True)
    fleet_name = models.CharField('Nombre flota', max_length=20, unique=True)

    def __str__(self):
        return self.fleet_name + ' ' + str(self.fleet_id)

class Device(models.Model):
    dev_eui = models.CharField(max_length=16, primary_key=True, unique=True)
    producer = models.CharField(max_length=20)
    model = models.CharField(max_length=20)
    dev_name = models.CharField(max_length=20, unique=True)

    fleet_id = models.ForeignKey(Fleet, on_delete=models.CASCADE)

    def __str__(self):
        return self.dev_eui

class DevData(models.Model):
    data_uuid = models.UUIDField(primary_key=True, default=uuid.uuid1, editable=False)
    frequency = models.IntegerField()
    data_1 = models.FloatField()
    data_2 = models.FloatField(null=True, blank=True)
    dev_eui = models.ForeignKey(Device, on_delete=models.CASCADE) #hay que saber porque añade _id

    def __str__(self):
        return self.dev_eui

И что я делаю это вызов моей функции view в моем коде JS для получения таких данных, как этот.

def getData(request):
    ctx = {}
    if request.method == 'POST':
        select = int(request.POST['Select'])

        data = DevData.objects.order_by('dev_eui','-data_timestamp').distinct('dev_eui')
        nodes = Device.objects.all()
        fleets = Fleet.objects.all()
        data = loads(serializers.serialize('json', data))
        nodes = loads(serializers.serialize('json', nodes))
        fleets = loads(serializers.serialize('json', fleets))

        ctx = {'Data':data, 'Nodes':nodes, 'Fleets':fleets}

    return JsonResponse(ctx)

А внутри моего файла js я фильтрую его с помощью некоторых if else условных выражений.

Это хорошо работает, но я уверен, что смогу сделать это напрямую, на мой взгляд, но я не знаю как. Как я могу получить только один JSON объект с объединенной информацией о трех моделях?

Большое спасибо !!

1 Ответ

0 голосов
/ 02 апреля 2020

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

from django.core.serializers.json import Serializer

class CustomSerializer(Serializer):

    def end_object(self, obj):
        for field in self.selected_fields:
            if field == 'pk':
                continue
            elif field in self._current.keys():
                continue
            else:
                try:
                    if '__' in field:
                        fields = field.split('__')
                        value = obj
                        for f in fields:
                            value = getattr(value, f)
                        if value != obj and isinstance(value, JSON_ALLOWED_OBJECTS) or value == None:
                            self._current[field] = value

                except AttributeError:
                    pass
        super(CustomSerializer, self).end_object(obj)

Затем использовать его следующим образом

serializers = CustomSerializer()
queryset = DevData.objects.all()
data = serializers.serialize(queryset, fields=('data_uuid', 'dev_eui__dev_eui', 'dev_eui__fleet_id__fleet_name'))

Я написал статью о сериализации вложенных данных здесь . Вы также можете это проверить.

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