首页 > 解决方案 > 如何只获取一个 JSON 对象并结合三个模型信息?

问题描述

如何将模型中的外键值传递给序列化的 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结合三种模型信息,如何仅获取一个对象?

非常感谢!!

标签: djangoserializationdjango-models

解决方案


您可以像这样编写自定义序列化程序:

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'))

我在这里写了一篇关于序列化嵌套数据的文章。你也可以检查一下。


推荐阅读