首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DRF模型字段中仅显示和使用日期时间中的天数,并发送填充字段的请求

如何在DRF模型字段中仅显示和使用日期时间中的天数,并发送填充字段的请求
EN

Stack Overflow用户
提问于 2020-12-28 17:58:58
回答 1查看 312关注 0票数 1

我的模型

代码语言:javascript
复制
class Reservation(models.Model):
    user = models.ForeignKey(
        User, verbose_name='owner',
        on_delete=models.CASCADE,
        default=User.objects.all()[0].pk
    )
    RESERVATION_TYPES = (
        ('office', 'office'),
        ('workplace', 'workplace')
    )
    reservation_type = models.CharField(
        verbose_name='reservation type',
        choices=RESERVATION_TYPES,
        max_length=9,
        default='workplace'
    )
    office = models.ForeignKey(
        Office, verbose_name='offices for reservation',
        on_delete=models.CASCADE,
        default=Office.objects.all()[0].pk
    )
    workplaces = models.CharField(
        verbose_name='workplaces for reservation',
        blank=True,
        max_length=9
    )
    initial_day = models.DateField(
        verbose_name='days delta initial day',
        default=datetime.now() + timedelta(days=1)
    )
    days_delta = models.DurationField(
        verbose_name='days delta',
        null=True,
        default=timedelta(days=0)
    )

我的序列化器

代码语言:javascript
复制
class ReservationDetailSerializer(serializers.ModelSerializer):
    reservation_days = serializers.SerializerMethodField('get_reservation_days_list')

    class Meta:
        model = Reservation
        fields = (
            'id', 'reservation_type', 'office', 'workplaces',
            'initial_day', 'days_delta', 'reservation_days', 'user'
        )

    def get_reservation_days_list(self, reservation_model):
        initial_day = reservation_model.initial_day
        days_delta = reservation_model.days_delta
        reservation_days = []

        for delta in range(days_delta.days):
            reservation_days.append(date.isoformat(initial_day + timedelta(days=delta)))

        return reservation_days

    def validate(self, validated_data):
        validated_data['days_delta'] = validated_data['days_delta'] * 86400
        
        if validated_data['reservation_type'] == 'office':
            workplaces = []
            for workplace in Workplace.objects.all().filter(office=validated_data['office']):
                workplaces.append(workplace.pk)
            validated_data['workplaces'] = workplaces

        return validated_data

我的观点

代码语言:javascript
复制
class ReservationCreateView(generics.CreateAPIView):
    serializer_class = ReservationDetailSerializer
    permission_classes = (IsAuthenticated,)

请求

days_delta,以秒为单位,乘以86400 (一天中的秒),将正确的间隔写入数据库。

days_delta,以秒为单位,乘以86400 (一天中的秒),将正确的间隔写入数据库。

代码语言:javascript
复制
{
    "reservation_type": "office",
    "office": 1,
    "initial_day": "2020-12-31",
    "days_delta": 5,
    "user": 2
}

响应

days_delta需要等于5(仅限天)

代码语言:javascript
复制
{
    "id": 62,
    "reservation_type": "office",
    "office": 1,
    "workplaces": "[1, 2, 3, 4, 5]",
    "initial_day": "2020-12-31",
    "days_delta": "5 00:00:00",
    "reservation_days": [
        "2020-12-31",
        "2021-01-01",
        "2021-01-02",
        "2021-01-03",
        "2021-01-04"
    ],
    "user": 2
}

帮帮我,西德两天..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-28 19:20:23

您可以重写to_representation(self, value)方法。此方法以字段的目标作为值参数,并应返回用于序列化目标的表示形式。value参数通常是一个模型实例。

要从timedelta获得天数,请使用.days属性。

serializer.py

代码语言:javascript
复制
class ReservationDetailSerializer(serializers.ModelSerializer):
    reservation_days = serializers.SerializerMethodField('get_reservation_days_list')

    class Meta:
        model = Reservation
        fields = (
            'id', 'reservation_type', 'office', 'workplaces',
            'initial_day', 'days_delta', 'reservation_days', 'user'
        )

    def to_representation(self, instance):
        change_fields = ( 'days_delta', )
        data = super().to_representation(instance)

        for field in change_fields:
            try:
                data[field] = field.days
            except Exception as e:
                print(e)
        return data 
                
    def get_reservation_days_list(self, reservation_model):
        initial_day = reservation_model.initial_day
        days_delta = reservation_model.days_delta
        reservation_days = []

        for delta in range(days_delta.days):
            reservation_days.append(date.isoformat(initial_day + timedelta(days=delta)))

        return reservation_days


    def validate(self, validated_data):
        validated_data['days_delta'] = validated_data['days_delta'] * 86400

        if validated_data['reservation_type'] == 'office':
            workplaces = []
            for workplace in Workplace.objects.all().filter(office=validated_data['office']):
                workplaces.append(workplace.pk)
            validated_data['workplaces'] = workplaces

        return validated_data
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65481945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档