Python model.save返回实例id无

Python model.save返回实例id无,python,django,django-models,Python,Django,Django Models,我有两个型号的产品和评论 class ProductReview(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) product = models.ForeignKey(Product, on_delete=models.CASCADE) review_heading = models.CharField(max_length=30) review_date = mod

我有两个型号的产品和评论

class ProductReview(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    review_heading = models.CharField(max_length=30)
    review_date = models.DateTimeField(auto_now_add=True)
    review_description = models.CharField(max_length=200)
    review_rating = models.PositiveIntegerField()
    review_product_image = models.ImageField(upload_to='review_image/', blank=True)


class Product(models.Model):

    name = models.CharField(max_length=100)
    price = models.IntegerField(default=0)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    description = models.CharField(max_length=300, default='', null=True, blank=True)
    product_image = models.ImageField(upload_to='', blank=True)
    is_varient = models.BooleanField(default=False)
    has_varient = models.BooleanField(default=False)
    is_published = models.BooleanField(default=False)
    varient_property = models.ManyToManyField(to='store.AttributeValue', blank=True)
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
我正在使用表单保存评论

def post(self, request, *args, **kwargs):
    form = ReviewForm(request.POST)
    if form.is_valid():
        instance = ProductReview(**form.cleaned_data)
        instance.save()
        print(model_to_dict(instance))


        # i have also tried form.save() but results the same
        # form.save()

        return redirect('OrderView')
模型到dict输出为

{'id': None, 'user': 1, 'product': 278, 'review_heading': 'nice product', 'review_description': 'ok', 'review_rating': 4, 'review_product_image': <ImageFieldFile: None>}
{'id':无,'user':1,'product':278,'review_heading':'nice product','review_description':'ok','review_rating':4,'review_product_image':}
在这里,它返回
id=none
,不保存任何内容

如果我保存产品的子实例,它将被保存,并返回
id=25

但当我保存主产品时,它返回
id=none


请帮助我保存主产品

您是否尝试过使用
序列化程序。ModelSerializer

下面是一些可能有帮助的示例代码:

型号.py

class Product(models.Model) :
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    price = models.IntegerField(default=0)
    description = models.CharField(max_length=300, null=True, default='')

class ProductReview(models.Model) :
    product = models.ForeignKey('Product', on_delete=models.CASCADE, related_name='reviews')
    id = models.IntegerField(primary_key=True)
    review_heading = models.CharField(max_length=30)
from rest_framework import serializers

from .models import Product, ProductReview

class ProductSerializer(serializers.ModelSerializer) :
    
    reviews = serializers.PrimaryKeyRelatedField(
        many=True,
        queryset=ProductReview.objects.all(),
    )

    def __init__(self, *args, **kwargs):
        kwargs['partial'] = True
        super(ProductSerializer, self).__init__(*args, **kwargs)

    class Meta :
        model = Product
        fields = ['id', 'name', 'price', 'description', 'reviews']

class ProductReviewSerializer(serializers.ModelSerializer) :
    
    product = serializers.PrimaryKeyRelatedField(
        queryset=Product.objects.all()
    )

    def __init__(self, *args, **kwargs):
        kwargs['partial'] = True
        super(ProductReviewSerializer, self).__init__(*args, **kwargs)

    class Meta :
        model = ProductReview
        fields = ['id', 'review_heading', 'product']


class ProductExpandForeignSerializer(ProductSerializer):
    reviews = ProductReviewSerializer(many=True)

    def create(self, validated_data):
        reviews_data = validated_data.pop('reviews',[])

        product = Product.objects.create(**validated_data)

        for productReview in reviews_data:
            ProductReview.objects.create(product=product, **productReview)

        return product

from rest_framework import viewsets

from .models import ProductReview
from .serializers import ProductReviewSerializer

class ProductreviewViewSet(viewsets.ModelViewSet) :
    queryset = ProductReview.objects.all()
    serializer_class = ProductReviewSerializer
    permission_classes = []
    filterset_fields = ['id', 'review_heading']

序列化程序.py

class Product(models.Model) :
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    price = models.IntegerField(default=0)
    description = models.CharField(max_length=300, null=True, default='')

class ProductReview(models.Model) :
    product = models.ForeignKey('Product', on_delete=models.CASCADE, related_name='reviews')
    id = models.IntegerField(primary_key=True)
    review_heading = models.CharField(max_length=30)
from rest_framework import serializers

from .models import Product, ProductReview

class ProductSerializer(serializers.ModelSerializer) :
    
    reviews = serializers.PrimaryKeyRelatedField(
        many=True,
        queryset=ProductReview.objects.all(),
    )

    def __init__(self, *args, **kwargs):
        kwargs['partial'] = True
        super(ProductSerializer, self).__init__(*args, **kwargs)

    class Meta :
        model = Product
        fields = ['id', 'name', 'price', 'description', 'reviews']

class ProductReviewSerializer(serializers.ModelSerializer) :
    
    product = serializers.PrimaryKeyRelatedField(
        queryset=Product.objects.all()
    )

    def __init__(self, *args, **kwargs):
        kwargs['partial'] = True
        super(ProductReviewSerializer, self).__init__(*args, **kwargs)

    class Meta :
        model = ProductReview
        fields = ['id', 'review_heading', 'product']


class ProductExpandForeignSerializer(ProductSerializer):
    reviews = ProductReviewSerializer(many=True)

    def create(self, validated_data):
        reviews_data = validated_data.pop('reviews',[])

        product = Product.objects.create(**validated_data)

        for productReview in reviews_data:
            ProductReview.objects.create(product=product, **productReview)

        return product

from rest_framework import viewsets

from .models import ProductReview
from .serializers import ProductReviewSerializer

class ProductreviewViewSet(viewsets.ModelViewSet) :
    queryset = ProductReview.objects.all()
    serializer_class = ProductReviewSerializer
    permission_classes = []
    filterset_fields = ['id', 'review_heading']

视图.py

class Product(models.Model) :
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    price = models.IntegerField(default=0)
    description = models.CharField(max_length=300, null=True, default='')

class ProductReview(models.Model) :
    product = models.ForeignKey('Product', on_delete=models.CASCADE, related_name='reviews')
    id = models.IntegerField(primary_key=True)
    review_heading = models.CharField(max_length=30)
from rest_framework import serializers

from .models import Product, ProductReview

class ProductSerializer(serializers.ModelSerializer) :
    
    reviews = serializers.PrimaryKeyRelatedField(
        many=True,
        queryset=ProductReview.objects.all(),
    )

    def __init__(self, *args, **kwargs):
        kwargs['partial'] = True
        super(ProductSerializer, self).__init__(*args, **kwargs)

    class Meta :
        model = Product
        fields = ['id', 'name', 'price', 'description', 'reviews']

class ProductReviewSerializer(serializers.ModelSerializer) :
    
    product = serializers.PrimaryKeyRelatedField(
        queryset=Product.objects.all()
    )

    def __init__(self, *args, **kwargs):
        kwargs['partial'] = True
        super(ProductReviewSerializer, self).__init__(*args, **kwargs)

    class Meta :
        model = ProductReview
        fields = ['id', 'review_heading', 'product']


class ProductExpandForeignSerializer(ProductSerializer):
    reviews = ProductReviewSerializer(many=True)

    def create(self, validated_data):
        reviews_data = validated_data.pop('reviews',[])

        product = Product.objects.create(**validated_data)

        for productReview in reviews_data:
            ProductReview.objects.create(product=product, **productReview)

        return product

from rest_framework import viewsets

from .models import ProductReview
from .serializers import ProductReviewSerializer

class ProductreviewViewSet(viewsets.ModelViewSet) :
    queryset = ProductReview.objects.all()
    serializer_class = ProductReviewSerializer
    permission_classes = []
    filterset_fields = ['id', 'review_heading']

.im配置

Model Product {
    id integer [primary-key]
    name string [max-length 100]
    price integer [default 0]
    description string [max-length 300, nullable, default ""]
}

Model ProductReview {
    id integer [primary-key]
    review_heading string [max-length 30]
}

Relation product-productreview {
    many reviews from ProductReview
    one  product  from  Product
}

API /productreview {
    actions CRUD
    model ProductReview
}

注意-上面的代码是由自动生成的,它允许从非常简单的配置为您的Django模型(以及API)生成干净的代码+测试。除其他外,它以正确的方式生成代码,以处理Django视图中的外键关系。您也可以在此处尝试演示

请展示您的
ReviewForm
谢谢@AbdulAzizBarkat的帮助我在模型保存方法中发现了我的错误。我在此处不使用rest框架。谢谢你的帮助