为了账号安全,请及时绑定邮箱和手机立即绑定

使用 json 将 django 日期时间传递到 golang 服务器

使用 json 将 django 日期时间传递到 golang 服务器

Go
慕莱坞森 2023-06-26 15:03:14
这是我的 Django 模型class Data(models.Model):    created = models.DateTimeField(null=True, blank=True, editable=False)    modified = models.DateTimeField(null=True, blank=True)    raw = models.TextField(null=True, blank=True)    uuid = models.CharField(blank=True, null=True, max_length=48,unique=True)    used = models.BooleanField(default=False,null=True)    name = models.CharField(blank=True, null=True, max_length=200)    geohash = models.CharField(blank=True, null=True, max_length=200)    def __str__(self):        return str(self.created) + ":" + str(self.raw)    def __unicode__(self):        return str(self.created) + ":" + str(self.raw)    def save(self, *args, **kwargs):        """ On save, update timestamps """        if not self.uuid :            self.uuid = str(uuid.uuid4().hex) +str(random.randint(1000,9999) )        if not self.id:            self.created = timezone.now()        self.modified = timezone.now()        # if not self.geoHash and (self.gpsLat and self.gpsLong):        # Geohash.encode(self.gpsLat, self.gpsLong)        return super(DataLbc, self).save(*args, **kwargs)    def toJson(self):        ret = {}        ret["Created"] = str(self.created)        ret["Modified"] = str(self.modified)        ret["Used"] = self.used        ret["Raw"] = self.raw        return ret这是我将其发送到我的 golang 服务器的方式:from RawOffer.models import Datawhile True:    try :        for data in Data.objects.all()[:10]:            requests.post("http://127.0.0.1:8087/convert/",json=data.toJson())    except Exception as e:        print(e)    time.sleep(5)但对于创建和修改当我尝试接收它时我有{0001-01-01 00:00:00 +0000 UTC false}如何序列化 django 日期时间以将其以 json 形式发送以及如何在 golang 中获取它?我的主要目标是将带有日期的对象从 django 应用程序发送到 golang 中的微服务。所以我需要序列化 django 日期并且我需要写很多文本,因为如果我没有写足够的文本,stackoverflow 不会让我发布我的程序......
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

这是与该问题相关的一个工作示例,可能对将来的某人有所帮助。


服务器.go


package main


import (

    "fmt"

    "github.com/gin-contrib/cors"

    "github.com/gin-gonic/gin"

    "github.com/jmoiron/sqlx"

    "gopkg.in/guregu/null.v3"

    "strconv"

)



type RawOffer struct {

    Used_f        bool          `json:"Used_f"`

    Used_t        bool          `json:"Used_t"`

    RawOfferData  string        `json:"Raw"`

    Modified      null.Time     `json:"Modified"`

    Created       null.Time     `json:"Created"`

}


func convert(c *gin.Context) {

    var rawOffer RawOffer

    c.BindJSON(&rawOffer)


    fmt.Println(`Used_f       = ` + strconv.FormatBool(rawOffer.Used_f))

    fmt.Println(`Used_t       = ` + strconv.FormatBool(rawOffer.Used_t))

    fmt.Println(`RawOfferData = `, rawOffer.RawOfferData)

    fmt.Println(`Modified     = `, rawOffer.Modified)

    fmt.Println(`Created      = `, rawOffer.Created)

}



var db *sqlx.DB

func main() {

    fmt.Println("begin")

    r := gin.Default()

    r.Use(cors.Default())


    r.POST("/convert/", convert)

    r.Run((":8087"))

}

test.py


import requests

import json

import datetime



def default(o):

    if isinstance(o, (datetime.date, datetime.datetime)):

        return o.isoformat() + 'Z'


try :

    data = dict(

        Created = datetime.datetime.utcnow(),

        Modified = datetime.datetime.utcnow(),

        Used_f = False,

        Used_t = True,

        Raw = 'some raw data here',

    )


    datastr = json.dumps(data, default=default)


    print(datastr)

    requests.post("http://127.0.0.1:8087/convert/", datastr)

except Exception as e:

    print(e)

登录test.py:


$ python test.py

{"Created": "2019-06-09T15:48:38.978230Z", "Modified": "2019-06-09T15:48:38.978689Z", "Used_f": false, "Used_t": true, "Raw": "some raw data here"}

登录服务器:


begin

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.


[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.

 - using env:   export GIN_MODE=release

 - using code:  gin.SetMode(gin.ReleaseMode)


[GIN-debug] POST   /convert/                 --> main.convert (4 handlers)

[GIN-debug] Listening and serving HTTP on :8087


Used_f       = false

Used_t       = true

RawOfferData =  some raw data here

Modified     =  {2019-06-09 15:48:38.978689 +0000 UTC true}

Created      =  {2019-06-09 15:48:38.97823 +0000 UTC true}

[GIN] 2019/06/09 - 11:48:39 |[97;42m 200 [0m|   16.979399ms |       127.0.0.1 |[97;46m POST    [0m /convert/



查看完整回答
反对 回复 2023-06-26
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

默认情况下,django 日期时间字段具有时区支持。你需要换个方式思考。或者您可以使用 django-extentions 。此第三方软件包附带一个创建和修改的日期时间字段,该字段不记录时区,使用这两个字段您将得到类似 {0001-01-01 00:00:00 } 的输出



查看完整回答
反对 回复 2023-06-26
?
GCT1015

TA贡献1827条经验 获得超4个赞

我使用了一个肮脏的技巧来序列化日期:


def toJson(self):

    ret = {}

    date_handler = lambda obj: (

        obj.isoformat()

        if isinstance(obj, (datetime.datetime, datetime.date))

        else None

    )

    ret["Created"] = str(json.dumps(self.created, default=date_handler)).replace("\"","")

    ret["Modified"] = str(json.dumps(self.modified, default=date_handler)).replace("\"","")

    ret["Used"] = self.used

    ret["Raw"] = self.raw

    return ret

我希望有人能找到更好的解决方案


查看完整回答
反对 回复 2023-06-26
  • 3 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信