Python 3.x 如何覆盖通过o-t-m关系链接到主模型的模型中的数据?

Python 3.x 如何覆盖通过o-t-m关系链接到主模型的模型中的数据?,python-3.x,django,django-models,django-rest-framework,django-views,Python 3.x,Django,Django Models,Django Rest Framework,Django Views,我有三个相互关联的模型,即: 型号.py class Shop(models.Model): number = models.PositiveSmallIntegerField() name = models.CharField(db_index=True) city = models.ForeignKey(ShopCity, on_delete=models.CASCADE) class Product(models.Model): name = models

我有三个相互关联的模型,即:

型号.py

class Shop(models.Model):
    number = models.PositiveSmallIntegerField()
    name = models.CharField(db_index=True)
    city = models.ForeignKey(ShopCity, on_delete=models.CASCADE)

class Product(models.Model):
    name = models.CharField(db_index=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)

class ProductQuantity(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField(default=None)
class ProductQuantityInline(admin.TabularInline):
    model = ProductQuantity
    extra = 0

@admin.register(Product)
class ProductAdmin(ImportExportActionModelAdmin):
    fields = ['name', 'price']
    list_display = ['name', 'price']
    inlines = [ProductQuantityInline]
class QuantitySerializer(serializers.ModelSerializer):

    class Meta:
        model = ProductQuantity
        fields = ('shop', 'quantity')

class ProductSerializer(serializers.ModelSerializer):
    productquantity = serializers.SerializerMethodField(read_only=False)

    class Meta:
        model = Product
        fields = ('name', 'price', 'productquantity')

    def get_productquantity(self, obj):
        return [QuantitySerializer(s).data for s in obj.productquantity_set.all()]
@api_view(['GET', 'PATCH', 'PUT', 'DELETE'])
def api_product_detail(request, pk):
    product = Product.objects.get(pk=pk)
    if request.method == 'GET':
        serializer = ProductSerializer(product)
        return Response(serializer.data)
    elif request.method == 'PUT' or request.method == 'PATCH':
        serializer = ProductSerializer(product, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    elif request.method == 'DELETE':
        product.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
在管理面板中,它们以以下方式链接:

admin.py

class Shop(models.Model):
    number = models.PositiveSmallIntegerField()
    name = models.CharField(db_index=True)
    city = models.ForeignKey(ShopCity, on_delete=models.CASCADE)

class Product(models.Model):
    name = models.CharField(db_index=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)

class ProductQuantity(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField(default=None)
class ProductQuantityInline(admin.TabularInline):
    model = ProductQuantity
    extra = 0

@admin.register(Product)
class ProductAdmin(ImportExportActionModelAdmin):
    fields = ['name', 'price']
    list_display = ['name', 'price']
    inlines = [ProductQuantityInline]
class QuantitySerializer(serializers.ModelSerializer):

    class Meta:
        model = ProductQuantity
        fields = ('shop', 'quantity')

class ProductSerializer(serializers.ModelSerializer):
    productquantity = serializers.SerializerMethodField(read_only=False)

    class Meta:
        model = Product
        fields = ('name', 'price', 'productquantity')

    def get_productquantity(self, obj):
        return [QuantitySerializer(s).data for s in obj.productquantity_set.all()]
@api_view(['GET', 'PATCH', 'PUT', 'DELETE'])
def api_product_detail(request, pk):
    product = Product.objects.get(pk=pk)
    if request.method == 'GET':
        serializer = ProductSerializer(product)
        return Response(serializer.data)
    elif request.method == 'PUT' or request.method == 'PATCH':
        serializer = ProductSerializer(product, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    elif request.method == 'DELETE':
        product.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
需要用RESTAPI覆盖数据

序列化程序.py

class Shop(models.Model):
    number = models.PositiveSmallIntegerField()
    name = models.CharField(db_index=True)
    city = models.ForeignKey(ShopCity, on_delete=models.CASCADE)

class Product(models.Model):
    name = models.CharField(db_index=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)

class ProductQuantity(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField(default=None)
class ProductQuantityInline(admin.TabularInline):
    model = ProductQuantity
    extra = 0

@admin.register(Product)
class ProductAdmin(ImportExportActionModelAdmin):
    fields = ['name', 'price']
    list_display = ['name', 'price']
    inlines = [ProductQuantityInline]
class QuantitySerializer(serializers.ModelSerializer):

    class Meta:
        model = ProductQuantity
        fields = ('shop', 'quantity')

class ProductSerializer(serializers.ModelSerializer):
    productquantity = serializers.SerializerMethodField(read_only=False)

    class Meta:
        model = Product
        fields = ('name', 'price', 'productquantity')

    def get_productquantity(self, obj):
        return [QuantitySerializer(s).data for s in obj.productquantity_set.all()]
@api_view(['GET', 'PATCH', 'PUT', 'DELETE'])
def api_product_detail(request, pk):
    product = Product.objects.get(pk=pk)
    if request.method == 'GET':
        serializer = ProductSerializer(product)
        return Response(serializer.data)
    elif request.method == 'PUT' or request.method == 'PATCH':
        serializer = ProductSerializer(product, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    elif request.method == 'DELETE':
        product.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
最后是我的REST API处理程序:

视图.py

class Shop(models.Model):
    number = models.PositiveSmallIntegerField()
    name = models.CharField(db_index=True)
    city = models.ForeignKey(ShopCity, on_delete=models.CASCADE)

class Product(models.Model):
    name = models.CharField(db_index=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)

class ProductQuantity(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE)
    quantity = models.PositiveSmallIntegerField(default=None)
class ProductQuantityInline(admin.TabularInline):
    model = ProductQuantity
    extra = 0

@admin.register(Product)
class ProductAdmin(ImportExportActionModelAdmin):
    fields = ['name', 'price']
    list_display = ['name', 'price']
    inlines = [ProductQuantityInline]
class QuantitySerializer(serializers.ModelSerializer):

    class Meta:
        model = ProductQuantity
        fields = ('shop', 'quantity')

class ProductSerializer(serializers.ModelSerializer):
    productquantity = serializers.SerializerMethodField(read_only=False)

    class Meta:
        model = Product
        fields = ('name', 'price', 'productquantity')

    def get_productquantity(self, obj):
        return [QuantitySerializer(s).data for s in obj.productquantity_set.all()]
@api_view(['GET', 'PATCH', 'PUT', 'DELETE'])
def api_product_detail(request, pk):
    product = Product.objects.get(pk=pk)
    if request.method == 'GET':
        serializer = ProductSerializer(product)
        return Response(serializer.data)
    elif request.method == 'PUT' or request.method == 'PATCH':
        serializer = ProductSerializer(product, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    elif request.method == 'DELETE':
        product.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
因此,名称价格等数据将被覆盖,而产品数量不会被覆盖。
我做错了什么?感谢您的帮助。

productquantity
是一个
序列化方法字段
,它是只读的(您不能强制它可写),因此它不会被覆盖是正常的行为。与DRF的关系复杂且不明显,因此最好覆盖序列化程序的create()和update()方法,以便了解它们的行为。我已经覆盖了update()方法,但不幸的是,我看到了相同的情况