Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Django REST框架替换特定url下的所有资源_Django_Django Rest Framework - Fatal编程技术网

用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
    有效,但我请您检查一下。这更简单

所以,事实证明这很简单。我必须同意纪尧姆的观点,即DRF文档非常优秀,我应该阅读它

网址:

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的一个例子。一旦我写完代码,我就会发布它。