django - 如何只获取一个 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
结合三种模型信息,如何仅获取一个对象?
非常感谢!!
解决方案
您可以像这样编写自定义序列化程序:
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'))
我在这里写了一篇关于序列化嵌套数据的文章。你也可以检查一下。
推荐阅读
- c++ - 如何在cpp中将%p转换为%d?
- python - 如何使用 OpenCV 在空白图像上准确地绘制它们在源图像中的形状?
- javascript - 真正的内存问题 - 云函数
- java - Android - 从服务器解析部分 JSON 文件
- python - 当有多个文件从其他文件导入类时,如何在 VS 代码中调试 python 代码?(有依赖时调试)
- python - Do I need celery with asynchronous web frameworks?
- python - 如何将查询集列添加到另一个查询集?
- java - 在实现 RecognitionListener 的 Service 上的空对象引用上的 getApplicationContext()
- javascript - 即使集合中有文档,Model.find({}) 也会返回空
- flutter - 用于多列显示的 Flutter Table