简体   繁体   English

如何使用 DRF 串行器处理数据

[英]How to process data with the DRF serializer

How can I convert time data (in seconds) to HH:MM:SS form in the DRF serializer?如何在 DRF 序列化程序中将时间数据(以秒为单位)转换为 HH:MM:SS 形式? There is a model and a serializer like this.有一个 model 和这样的串行器。

Model Model

class Entry(models.Model):
    project = models.ForeignKey(Project,
                                related_name='entries',
                                on_delete=models.CASCADE)
    time = models.IntegerField(default=0)
    user = models.ForeignKey(User,
                             related_name='entries',
                             on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return '%s - %s' % (self.project.name, self.created_at)

Serializer串行器

class EntrySerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True)
    project_post = serializers.PrimaryKeyRelatedField(
        queryset=Project.objects.all(), write_only=True)
    hms = serializers.SerializerMethodField()

    class Meta:
        model = Entry
        fields = '__all__'

    def create(self, validated_date):
        validated_date['project'] = validated_date.get('project_post', None)
        if validated_date['project'] is None:
            raise serializer.ValidationError("project")
        del validated_date['project_post']
        return Entry.objects.create(**validated_date)

In the case of JavaScript, I was able to convert it with the following code, but how do I do it with the DRF Serializer?在 JavaScript 的情况下,我可以使用以下代码对其进行转换,但如何使用 DRF 串行器进行转换?

const time = this.state.time + 1;
const hours = parseInt(time / 60 / 60, 10);
const minutes = parseInt(time / 60 % 60, 10);
const seconds = parseInt(time % 60, 10);
this.setState({
    hours: this.toText(hours),
    minutes: this.toText(minutes),
    seconds: this.toText(seconds),
    time: time
});

If request data is in seconds(ex: 1675716401) as below, then it should be doable with python datetime library, if not please specify the format in which datetime is provided and re-format it using strftime [https://strftime.org][1]如果请求数据以秒为单位(例如:1675716401)如下,那么它应该可以使用 python datetime时间库,如果不是,请指定提供日期时间的格式并使用 strftime 重新格式化 [https://strftime.org ][1]

 from datetime import datetime
    datetime.fromtimestamp(1675716401).strftime("%H:%M:%S")

In EntrySerializer you can add method as below with needed formatEntrySerializer ,您可以使用所需的格式添加如下方法

def get_hms(hms):
    return datetime.fromtimestamp(hms).strftime("%H:%M:%S")

Time I have used is Epoch time, so converting exact 84 seconds deosnt make much sense, If you are aware of the date then use relativedelta to adjust time and it mainly depend on how the input you get.我使用的时间是纪元时间,因此转换精确的 84 秒 deosnt 很有意义,如果您知道日期,则使用relativedelta来调整时间,这主要取决于您获得的输入。

Below is sample to add seconds to current time下面是添加秒到当前时间的示例

from dateutil.relativedelta import relativedelta
from datetime import datetime
datetime.now() + relativedelta(seconds=90)
datetime.datetime(2021, 2, 22, 14, 29, 56, 758793)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM