首页 > 解决方案 > TypeError:products() 为参数 'pk' 获得了多个值

问题描述

模型.py

我有两个具有多字段的模型,这让我每次都感到困惑。

 class Product(models.Model):
        product_name = models.CharField(max_length=32)
        quantity = models.IntegerField()
        remarks = models.TextField(blank=True)

class Vendor(models.Model):
    vendor_name = models.CharField(max_length=50)
    address = models.CharField(max_length=100)
    bill_no = models.CharField(max_length=8)
    product = models.ManyToManyField(Product)

序列化程序.py

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

class VendorSerializer(serializers.ModelSerializer):
    product = ProductSerializer(many=True, read_only=False)
    class Meta:
        model = Vendor
        fields = '__all__'
    def create(self, validate_data):
        product_data = validate_data.pop('product')
        vendor = Vendor.objects.create(**validate_data)
        for product_data in product_data:
            Product.objects.create(vendor=vendor, **product_data)
        return Vendor

视图.py

from rest_framework.decorators import detail_route

class VendorViewset(viewsets.ModelViewSet):
      serializer_class = VendorSerializer
      queryset = Vendor.objects.all()

  @detail_route(methods=['GET'])
  def products(request, pk=None):
      qs = self.get_object().product.all()
      serializer = ProductSerializer(qs, many=True)
      return Response(serializer.data)

网址.py

from django.conf.urls import url, include
from . import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('vendor', views.VendorViewset)

urlpatterns = [
    url(r'', include(router.urls)),
]

然后我浏览http://localhost:8000/vendor/1/products/我得到了那个错误。如何解决?

标签: pythondjangodjango-rest-frameworkmanytomanyfield

解决方案


方法的第一个参数应该是self

 @detail_route(methods=['GET'])
  def products(self, request, pk=None):
      qs = self.get_object().product.all()
      serializer = ProductSerializer(qs, many=True)
      return Response(serializer.data)

推荐阅读