我的模型
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)
)我的序列化器
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我的观点
class ReservationCreateView(generics.CreateAPIView):
serializer_class = ReservationDetailSerializer
permission_classes = (IsAuthenticated,)请求
days_delta,以秒为单位,乘以86400 (一天中的秒),将正确的间隔写入数据库。
days_delta,以秒为单位,乘以86400 (一天中的秒),将正确的间隔写入数据库。
{
"reservation_type": "office",
"office": 1,
"initial_day": "2020-12-31",
"days_delta": 5,
"user": 2
}响应
days_delta需要等于5(仅限天)
{
"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
}帮帮我,西德两天..。
发布于 2020-12-28 19:20:23
您可以重写to_representation(self, value)方法。此方法以字段的目标作为值参数,并应返回用于序列化目标的表示形式。value参数通常是一个模型实例。
要从timedelta获得天数,请使用.days属性。
serializer.py
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_datahttps://stackoverflow.com/questions/65481945
复制相似问题