【问题标题】:ManytoMany related to django Rest与 django Rest 相关的多对多
【发布时间】:2018-06-08 08:09:13
【问题描述】:

modes.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)

serializers.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

views.py

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

如何写产品视图,才能证明某个厂商的产品只能通过url路由查看?

【问题讨论】:

    标签: python django django-rest-framework manytomanyfield


    【解决方案1】:

    您可以使用@detail_route:

    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)
    

    然后供应商产品将由

    提供
    YOUCURRENT_PATH_TO_DETAIL_VENDOR/products
    

    【讨论】:

    • 添加上述代码后:我得到 -> 异常类型:TypeError 异常值:products() 为参数 'pk' 获得了多个值
    • show url 你试试,我不明白你是怎么发现错误的
    猜你喜欢
    • 2023-03-14
    • 2020-10-20
    • 2020-10-27
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2014-12-11
    相关资源
    最近更新 更多