Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TimestampWithTimeZone returned as array #2159

Open
rgreinho opened this issue Mar 15, 2024 · 0 comments
Open

TimestampWithTimeZone returned as array #2159

rgreinho opened this issue Mar 15, 2024 · 0 comments

Comments

@rgreinho
Copy link

Description & Expected Behavior

In my models I have the created_at/updated_at columns defined as TimestampWithTimeZone.

When I retrieve the models, the TimestampWithTimeZone columns are returned as arrays with a strange format, like \"created_at\":[2024,75,16,24,39,144518000,0,0,0]} but I was expecting an ISO8601, something more like \"created_at\":\"+002024-03-15T16:26:38.178125000Z\" that my frontend can consume directly.

Reproduces How Often

Always reproducible.

Workarounds

My work around currently is to generate my entities with sea-orm-cli generate entity -o "entity/src/entities" --with-serde both --date-time-crate time, then to manually edit the models everywhere I use a TimestampWithTimeZone and add this serde attribute: #[serde(with = "time::serde::iso8601")]. However this approach does not scale.

Is there a way to have seaorm automatically add the serde attribute for the TimestampWithTimeZone fields?

Reproducible Example

entity/src/entities/submission.rs:

//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.14

use super::sea_orm_active_enums::ApprovalStatus;
use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)]
#[sea_orm(table_name = "submission")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub id: i32,
    pub first_name: String,
    pub last_name: String,
    pub title: Option<String>,
    pub organization: Option<String>,
    pub email: String,
    pub country: String,
    pub city: String,
    pub region: Option<String>,
    pub fips_code: String,
    pub consent: bool,
    pub created_at: TimeDateTimeWithTimeZone,
}

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}

impl ActiveModelBehavior for ActiveModel {}

#[cfg(test)]
mod tests {
    use super::*;

   #[test]
    fn test_date_ser() {
        let m = submission::Model {
            id: 1,
            first_name: String::from("first_name"),
            last_name: String::from("last_name"),
            title: Some(String::from("title")),
            organization: Some(String::from("organization")),
            email: String::from("email"),
            country: String::from("country"),
            city: String::from("city"),
            region: Some(String::from("region")),
            fips_code: String::from("fips_code"),
            consent: true,
            created_at: TimeDateTimeWithTimeZone::now_utc(),
        };
        let d = serde_json::to_string(&m).unwrap();
        dbg!(d);
    }
}

The JSON output is:

{
  "id": 1,
  "first_name": "first_name",
  "last_name": "last_name",
  "title": "title",
  "organization": "organization",
  "email": "email",
  "country": "country",
  "city": "city",
  "region": "region",
  "fips_code": "fips_code",
  "consent": true,
  "status": "Pending",
  "created_at": [
    2024,
    75,
    18,
    33,
    44,
    836831000,
    0,
    0,
    0
  ]
}

Versions

I am using seaorm 0.12.14 with the time library.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant