Почему данные JSONField не отображаются корректно в ответе векторной плитки?
Я столкнулся с проблемой отображения данных из JSONField в векторной плитке (MVT) в Django.
Значение данных в столбце test_json_field следующее:
{
"look": "1",
"at": 2,
"some": "asdfjkl;",
"JSON": [
{
"data": 1234,
"arranged": "(and how!)"
},
"as an example"
]
}
В моем коде я определил tile_fields как:
tile_fields = ("start_time", "end_time", "test_json_field")
Однако, когда я отображаю представление, я вижу только следующие поля в ответе JSON:
`{
"start_time": "2024-12-12 08:00:00+00",
"end_time": "2024-12-12 08:15:00+00",
"at": 2,
"look": "1",
"some": "asdfjkl;",
"layer": "trajectory"
}
`
Но другие значения в столбце test_json_field (например, массив JSON) не отображаются.
Вот мой код: Класс TrajectoryTileView:
`class TrajectoryTileView(VectorLayer):
"""
A view to represent trajectory data as a vector tile layer.
"""
model = Trajectory
id = "trajectory"
tile_fields = ("start_time", "end_time", "test_json_field")
geom_field = "geom"
def get_queryset(self):
device_id = getattr(self, "device_id", None)
queryset = Trajectory.objects.all()
if device_id:
queryset = queryset.filter(device__uid=device_id)
return queryset`
Класс TrajectoryMVTView:
`class TrajectoryMVTView(MVTView):
"""
MVTView handles one or more vector layers defined in the layer_classes attribute.
"""
layer_classes = [TrajectoryTileView]
def get(self, request, *args, **kwargs):
device_id = kwargs.get("device_id")
for layer_class in self.layer_classes:
layer_class.device_id = device_id
try:
response = super().get(request, *args, **kwargs)
except Exception as e:
print(f"An error occurred: {e}")
raise
return response`
Модель траектории:
`class Trajectory(models.Model):
uid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
device = models.ForeignKey(Device, on_delete=models.CASCADE, related_name='trajectories')
geom = models.LineStringField(srid=3857) # Line representing the trajectory
device_data = models.JSONField(blank=True, null=True) # List of attributes associated with each point
start_time = models.DateTimeField(auto_now_add=True) # Start time of the trajectory
end_time = models.DateTimeField(null=True, blank=True) # End time of the trajectory
test_json_field = models.JSONField(null=True)
`
Вопрос: Почему другие значения в поле test_json_field (например, массив JSON) не отображаются в ответе? Может быть, проблема в том, как я настроил tile_fields или обработал JSONField в представлении?
Спасибо за помощь!
Я уже реализовал сериализацию
class TrajectoryPropertiesSerializer(serializers.ModelSerializer):
device_data = serializers.JSONField(read_only=True, allow_null=True)
class Meta:
model = Trajectory
fields = ['device_data', 'device', "geom", "start_time", "end_time","test_json_field"]
Это получение функции во фронтенде (Angular):
this.map.on('click', (e) => {
const clickedFeature = this.map.forEachFeatureAtPixel(e.pixel, (feature) => {
return feature;
});
if (clickedFeature) {
const feature = clickedFeature as Feature;
console.log("FEATURE VALUES ==>>>>>> ", feature);
}
});