假设我有某种模式:
class PricePeriod(models.Model):
name = models.CharField(max_length=50)
arrival_date = models.DateField()
departure_date = models.DateField()
price = models.DecimalField(max_digits = 10, decimal_places=2)
观点:
class HousePricePeriodList(generics.ListCreateAPIView):
serializer_class = PricePeriodSerializer
def get_queryset(self):
return PricePeriod.objects.filter(house = self.kwargs['houseId'])
序列化器:
class PricePeriodSerializer(serializers.ModelSerializer):
many = True
class Meta:
model = PricePeriod
fields = ('name',
'arrival_date',
'departure_date',
'price')
此视图位于网址
下/houses/:houseId/price_periods
单独编辑这些价格周期非常罕见,它们会被创建,更新和删除很多。
我想要实现的目标:
/ house /:houseId / price_periods的一系列价格周期的PUT将删除与该houseId关联的所有价格周期,并将其替换为请求正文中的那些。
在DRF中有标准的方法吗?或者我是否必须编写自定义视图/序列化程序?
答案 0 :(得分:2)
DRF文档非常好。您有几种选择:
一些注意事项:
PricePeriod
错过了House
外键。我猜你忘了它get_queryset
有效,但我邀请您查看http://www.django-rest-framework.org/api-guide/filtering/。这更简单答案 1 :(得分:1)
所以,事实证明这很简单。我必须同意Guillaume的说法,DRF文档非常好,我应该阅读它。
http://www.django-rest-framework.org/
网址:
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<div id='foo'></div>
<div id='bar'></div>
序列化程序只是标准的ModelSerializer:
url(r'houses/(?P<houseId>[0-9]+)/price_periods/$',
views.HousePricePeriodList.as_view(),
name='house-price-periods-list'),
请注意,序列化程序不包含house ID,因为它是通过URL提供的。
该模型也很标准:
class PricePeriodSerializer(serializers.ModelSerializer):
class Meta:
model = PricePeriod
fields = ('name',
'arrival_date',
'spearture_date',
'price')
唯一不标准的是视图,它只是基于APIView的基于类的视图:
class PricePeriod(models.Model):
name = models.CharField(max_length=50)
house = models.ForeignKey(House, on_delete=models.CASCADE)
arrival_date = models.DateField()
departure_date = models.DateField(null=True)
price = models.DecimalField(max_digits = 10, decimal_places=2)
DRF教程实际上很好地描述了这一点。它开始很慢,从标准的Django东西到高级别的东西。这真的值得一读,因为只需快速浏览就可以产生框架非常高级的印象,而实际上它可以让你达到你想要的低级别。