【发布时间】:2019-03-18 16:07:58
【问题描述】:
我目前正在尝试使用drf_writable_nested 来更新和创建我当前的数据库架构,但我一直面临这个错误:
.create() 方法默认不支持可写嵌套字段。
为序列化器trvl.serializers.StatisticsSerializer 写一个显式的.create() 方法,或者在嵌套的序列化器字段上设置read_only=True。
主要型号:
class Statistics(models.Model):
"""Instance: {airport_code, carrier_code, month, year, flight, delay_count, delay_time}"""
airport = models.ForeignKey(Airport, on_delete=models.CASCADE)
carrier = models.ForeignKey(Carrier, on_delete=models.CASCADE)
month = models.IntegerField(
validators=[MinValueValidator(1), MaxValueValidator(12)])
year = models.IntegerField(validators=[MinValueValidator(
1900, message='Invalid year: year < 1900.')])
# statistics linkage
flight = models.ForeignKey(
FlightStatistics, on_delete=models.DO_NOTHING)
delay_count = models.ForeignKey(
DelayCountStatistics, on_delete=models.DO_NOTHING)
delay_time = models.ForeignKey(
DelayTimeStatistics, on_delete=models.DO_NOTHING)
# Guaranteeing the "primary key" of the tuple
class Meta:
unique_together = ('airport', 'carrier', 'month', 'year')
def __str__(self):
return '%s_%s_%s_%s' % (self.airport, self.carrier, self.month, self.year)
序列化器:
class StatisticsSerializer(WritableNestedModelSerializer):
# Using nest serializer for handling get and post
# Using serializers instead of the model fields
flight = FlightStatisticsSerializer()
delaycount = DelayCountStatisticsSerializer()
delaytime = DelayTimeStatisticsSerializer()
class Meta:
model = models.Statistics
fields = ('airport', 'carrier', 'month', 'year',
'flight', 'delaytime', 'delaycount')
查看:
class StatisticsView(viewsets.ModelViewSet, NestedCreateMixin, NestedUpdateMixin):
queryset = models.Statistics.objects.all()
serializer_class = serializers.StatisticsSerializer
def post(self,request,*args, **kwargs):
return self.create(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
有效负载示例:
{
"airport": "ATL",
"carrier": "AA",
"month": 7,
"year": 2008,
"flight": {
"cancelled": 2,
"on_time": 30,
"total": 100l,
"delayed": 303,
"diverted": 121
},
"delaytime": {
"late_aircraft": 21,
"weather": 2121,
"security": 2121,
"national_aviation_system": 21212,
"carrier": 22
},
"delaycount": {
"late_aircraft": 1212,
"weather": 1212,
"security": 1221,
"national_aviation_system": 1221,
"carrier": 1212
}
}
【问题讨论】:
标签: python django django-rest-framework django-views mixins