用Django REST框架替换特定URL下的所有资源

时间:2016-07-05 19:48:41

标签: 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 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中有标准的方法吗?或者我是否必须编写自定义视图/序列化程序?

2 个答案:

答案 0 :(得分:2)

DRF文档非常好。您有几种选择:

一些注意事项:

答案 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东西到高级别的东西。这真的值得一读,因为只需快速浏览就可以产生框架非常高级的印象,而实际上它可以让你达到你想要的低级别。