2017-09-26 4 views
0

J'ai un modèle appelé Tâche avec délai de trame qui est un champ de durée.Comment changer le format d'une valeur de champ dans le sérialiseur de modèle en gardant le même nom de champ dans les deux affichage et créer?

class Task: 
    delay = models.DurationField(timedelta(seconds=0)) 

et un sérialiseur comme ci-dessous. Lors de la création d'une instance à l'aide du sérialiseur, je transmets des données telles que {delay: 30} en attendant que les secondes soient passées.

L'instance est créée comme prévu. Cependant, lors de la récupération, je reçois le résultat ci-dessous.

[ { "retard": "00: 00: 00,000060", }, { "retard": "00: 00: 00,000050", }, { "retard": « 00 : 00: 00.000060 ", } ]

J'essaye d'obtenir la valeur de retard dans le sérialiseur dans le format entier seulement. Par exemple:

[ { "retard": 60, }, { "retard": 50, }, { "retard": 60 } ]

Je suis ne souhaitant pas modifier le nom de champ "delay" dans le sérialiseur d'écriture ou de lecture. Comment puis-je atteindre l'exigence?

Répondre

1

Je suppose que l'entier est interprété comme microsecondes et vous devez envoyer vos secondes comme une chaîne

{"delay": "60"} 

Si vous voulez envoyer les secondes comme entier (dans le JSON) vous devez créer pbly un champ personnalisé. Le plus simple serait d'hériter de DurationField() et d'adapter le comportement à vos besoins.

+0

Merci. Pouvez-vous penser à une solution facile sans créer de champ de modèle personnalisé? –

+0

Essayez le timedelta sous forme de chaîne, je ne pense pas que timedelta est destiné à être utilisé avec un entier, je pense que ce que vous faites est d'utiliser un fallback pour DurationField et que la résolution par défaut pour un champ timedelta est de microsecondes votre valeur d'entrée est interpredet en microsecondes. Vous pouvez voir que dans vos exemples, ce que vous obtenez est une chaîne qui représente un 'timedelta'. –