在 Django REST Framework 中向 get_queryset 请求添加参数

阿努吉TBE

我正在使用Django 2.0Django REST Framework

我在通讯录应用中有两个模型

联系人/模型.py

class Contact(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100, blank=True, null=True, default='')


class ContactPhoneNumber(models.Model):
    contact = models.ForeignKey(Contact, on_delete=models.CASCADE)
    phone = models.CharField(max_length=100)
    primary = models.BooleanField(default=False)

    def __str__(self):
        return self.phone

联系人/序列化器.py

class ContactPhoneNumberSerializer(serializers.ModelSerializer):
    class Meta:
        model = ContactPhoneNumber
        fields = ('id', 'phone', 'primary', 'created', 'modified')

联系人/views.py

class ContactPhoneNumberViewSet(viewsets.ModelViewSet):
    serializer_class = ContactPhoneNumberSerializer

    def get_queryset(self):
        return ContactPhoneNumber.objects.filter(
            contact__user=self.request.user
        )

网址.py

router.register(r'contact-phone', ContactPhoneNumberViewSet, 'contact_phone_numbers')

我想要的是跟随端点

  • GET: /contact-phone/{contact_id}/ 列出特定联系人的电话号码
  • POST:/contact-phone/{contact_id}/ 将电话号码添加到特定联系人
  • PUT: /contact-phone/{contact_phone_number_id}/ 更新特定电话号码
  • DELETE: /contact-phone/{contact_phone_number_id}/ 删除特定电话号码

PUT并且Delete可以作为默认操作实现,ModelViewSet但是如何使get_queryset接受contact_id作为必需参数?

编辑 2

我按照文档将ViewSets 明确地绑定到 URL

更新app/urls.py

router = routers.DefaultRouter()
router.register(r'contacts', ContactViewSet, 'contacts')
contact_phone_number_view_set = ContactPhoneNumberViewSet.as_view({
    'get': 'list/<contact_pk>/',
    'post': 'create/<contact_pk>/',
    'put': 'update',
    'delete': 'destroy'
})
router.register(r'contact-phone-number', contact_phone_number_view_set, 'contact_phone_numbers')

urlpatterns = [
    path('api/', include(router.urls)),
    url(r'^admin/', admin.site.urls),
]

但它给出了错误

AttributeError: 'function' object has no attribute 'get_extra_actions'
从不独行者

您可以使用@action装饰器向视图集添加额外的操作

class ContactPhoneNumberViewSet(viewsets.ModelViewSet):
    serializer_class = ContactPhoneNumberSerializer

    def get_queryset(self):
        return ContactPhoneNumber.objects.filter(
            contact__user=self.request.user
        )

    @action(methods=['post'], detail=False)
    def add_to_contact(self, request, contact_id=None):
        contact = Contact.objects.get(id=contact_id)
        serializer = ContactPhoneNumberSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(contact=contact)
            return Response(serializer.data)
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

    @action(methods=['get'], detail=False)
    def set_password(self, request, contact_id=None):
        contact = Contact.objects.get(id=contact_id)
        serializer = PasswordSerializer(contact.contactphonenumber_set.all(), many=True)
        return Response(serializer.data)

UPD

由于您不需要额外的操作,您可以覆盖retrievecreate默认方法:

class ContactPhoneNumberViewSet(viewsets.ModelViewSet):
        serializer_class = ContactPhoneNumberSerializer

        def get_queryset(self):
            return ContactPhoneNumber.objects.filter(
                contact__user=self.request.user
            )

        def create(self, request, pk=None):
            contact = Contact.objects.get(id=contact_id)
            serializer = ContactPhoneNumberSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save(contact=contact)
                return Response(serializer.data)
            else:
                return Response(serializer.errors,
                                status=status.HTTP_400_BAD_REQUEST)

        def retrieve(self, request, pk=None):
            contact = Contact.objects.get(pk=pk)
            serializer = PasswordSerializer(contact.contactphonenumber_set.all(), many=True)
            return Response(serializer.data)

要更改标准createurl 使用明确的 url 绑定:

contact_list = ContactPhoneNumberViewSet.as_view({
    'get': 'list',
    'post': 'create',
    'put': 'update',
    'delete': 'destroy'
})

urlpatterns = [
    path('api//contact-phone/<int:pk>/', contact_list, name='contact-list'),
    url(r'^admin/', admin.site.urls),
]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Django REST Framework中向GET请求添加搜索参数?

来自分类Dev

如何在Django Rest Framework 3中覆盖ModelViewSet的get_queryset?

来自分类Dev

Django Rest框架中的get_queryset方法和ViewSets

来自分类Dev

get_queryset不会影响Django rest框架ModelViewSet中的查询

来自分类Dev

Django:在UpdateView中覆盖get_queryset()

来自分类Dev

向 Django Rest Framework 发送 PATCH 请求

来自分类Dev

如何在 Django CBV get_queryset() 中检索 GET 参数

来自分类Dev

Django Rest Framework:如何在GET请求的响应中添加自定义字段?

来自分类Dev

Django Rest Framework:如何在GET请求的响应中添加自定义字段?

来自分类Dev

从get_queryset()django更新上下文参数值

来自分类Dev

在Django Rest Framework中测试PUT请求

来自分类Dev

在 Django REST Framework 中更新/放置请求

来自分类Dev

Django过滤器get_queryset中的ForeignKey关系

来自分类Dev

在Django Rest Framework中向JSON响应添加多个模型和自定义字段

来自分类Dev

在Django-rest-framework中捕获参数

来自分类Dev

在Django rest Framework中传递几个参数

来自分类Dev

在get_queryset中添加新的上下文变量

来自分类Dev

如何在Django-rest-framework queryset响应中添加注释数据?

来自分类Dev

django或django-rest-framework中必需的POST参数

来自分类Dev

django或django-rest-framework中必需的POST参数

来自分类Dev

在 Django Rest Framework 中处理来自可浏览 API 的 POST 请求查询参数

来自分类Dev

Django Rest Framework APIView参数

来自分类Dev

在Django REST Framework中何处更改POST请求的响应

来自分类Dev

根据请求类型更改Django REST Framework ModelSerializer中的字段?

来自分类Dev

如何在Django REST Framework中设置POST请求的权限?

来自分类Dev

Django Rest Framework:默认外键为请求中的值

来自分类Dev

在Django Rest Framework中的任何类型的请求之前执行操作

来自分类Dev

Django REST Framework 序列化程序 PrimaryKeyRelatedField() 未在 GET 响应中添加对象

来自分类Dev

django-rest-framework:URL中的列表参数

Related 相关文章

  1. 1

    如何在Django REST Framework中向GET请求添加搜索参数?

  2. 2

    如何在Django Rest Framework 3中覆盖ModelViewSet的get_queryset?

  3. 3

    Django Rest框架中的get_queryset方法和ViewSets

  4. 4

    get_queryset不会影响Django rest框架ModelViewSet中的查询

  5. 5

    Django:在UpdateView中覆盖get_queryset()

  6. 6

    向 Django Rest Framework 发送 PATCH 请求

  7. 7

    如何在 Django CBV get_queryset() 中检索 GET 参数

  8. 8

    Django Rest Framework:如何在GET请求的响应中添加自定义字段?

  9. 9

    Django Rest Framework:如何在GET请求的响应中添加自定义字段?

  10. 10

    从get_queryset()django更新上下文参数值

  11. 11

    在Django Rest Framework中测试PUT请求

  12. 12

    在 Django REST Framework 中更新/放置请求

  13. 13

    Django过滤器get_queryset中的ForeignKey关系

  14. 14

    在Django Rest Framework中向JSON响应添加多个模型和自定义字段

  15. 15

    在Django-rest-framework中捕获参数

  16. 16

    在Django rest Framework中传递几个参数

  17. 17

    在get_queryset中添加新的上下文变量

  18. 18

    如何在Django-rest-framework queryset响应中添加注释数据?

  19. 19

    django或django-rest-framework中必需的POST参数

  20. 20

    django或django-rest-framework中必需的POST参数

  21. 21

    在 Django Rest Framework 中处理来自可浏览 API 的 POST 请求查询参数

  22. 22

    Django Rest Framework APIView参数

  23. 23

    在Django REST Framework中何处更改POST请求的响应

  24. 24

    根据请求类型更改Django REST Framework ModelSerializer中的字段?

  25. 25

    如何在Django REST Framework中设置POST请求的权限?

  26. 26

    Django Rest Framework:默认外键为请求中的值

  27. 27

    在Django Rest Framework中的任何类型的请求之前执行操作

  28. 28

    Django REST Framework 序列化程序 PrimaryKeyRelatedField() 未在 GET 响应中添加对象

  29. 29

    django-rest-framework:URL中的列表参数

热门标签

归档