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框架。谢谢你的帮助