用Django REST框架替换特定url下的所有资源
假设我有一个特定的模型:用Django REST框架替换特定url下的所有资源,django,django-rest-framework,Django,Django Rest Framework,假设我有一个特定的模型: 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 House
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')
class PricePeriodSerializer(serializers.ModelSerializer):
class Meta:
model = PricePeriod
fields = ('name',
'arrival_date',
'spearture_date',
'price')
此视图位于url下:
/houses/:houseId/price_periods
单独编辑这些价格周期将非常罕见,它们会被创建、更新和删除很多
我希望达到的目标是:
将价格周期数组放入/houses/:houseId/price_periods将删除与该houseId关联的所有价格周期,并将其替换为请求正文中的价格周期
在DRF中有没有标准的方法来实现这一点?还是必须编写自定义视图/序列化程序?DRF文档非常好。您有几个选择:
- 您的
丢失了PricePeriod
外键。我猜你忘了House
- 您的
有效,但我请您检查一下。这更简单get\u queryset
url(r'houses/(?P<houseId>[0-9]+)/price_periods/$',
views.HousePricePeriodList.as_view(),
name='house-price-periods-list'),
请注意,序列化程序不包括房屋id,因为它通过URL提供了房屋id
模型也相当标准:
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)
唯一非标准的是视图,它只是基于APIView的基于类的视图:
class HousePricePeriodList(APIView):
def get(self, request, houseId):
pricePeriods = PricePeriod.objects.filter(house = houseId).all()
serializer = PricePeriodSerializer(pricePeriods,many=True)
return Response(serializer.data)
def put(self, request, houseId):
serializer = PricePeriodSerializer(data=request.data, many=True)
if serializer.is_valid():
oldPricePeriods = PricePeriod.objects.filter(house = houseId)
oldPricePeriods.delete();
# Add the house_id from the url to the objects
for period in serializer.validated_data:
period['house_id'] = houseId
#write to db
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
DRF教程实际上很好地描述了这一点。它开始的很慢,从标准的Django东西发展到非常高级的东西。这确实值得一读,因为只需快速浏览一下,可能会给人一种框架非常高级的印象,而实际上它允许您按照自己的意愿进行低级操作。您必须为这种行为编写自己的逻辑。谢谢,我想这只是RTFM的一个例子。一旦我写完代码,我就会发布它。