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

这是我的 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 Data

while 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 不会让我发布我的程序......


慕莱坞森
浏览 93回答 3
3回答

蝴蝶不菲

这是与该问题相关的一个工作示例,可能对将来的某人有所帮助。服务器.gopackage mainimport (    "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.DBfunc main() {    fmt.Println("begin")    r := gin.Default()    r.Use(cors.Default())    r.POST("/convert/", convert)    r.Run((":8087"))}test.pyimport requestsimport jsonimport datetimedef 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 :8087Used_f       = falseUsed_t       = trueRawOfferData =  some raw data hereModified     =  {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/

慕姐4208626

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

GCT1015

我使用了一个肮脏的技巧来序列化日期: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我希望有人能找到更好的解决方案
打开App,查看更多内容
随时随地看视频慕课网APP