【问题标题】:model.save return instance id nonemodel.save 返回实例 id 无
【发布时间】:2021-01-19 06:29:36
【问题描述】:

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

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')

model_to_dict 输出是

{'id': None, 'user': 1, 'product': 278, 'review_heading': 'nice product', 'review_description': 'ok', 'review_rating': 4, 'review_product_image': <ImageFieldFile: None>}

这里它返回 id=none 并且没有保存任何内容。

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

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

请帮我保存主产品

【问题讨论】:

  • 请出示您的ReviewForm
  • 感谢@AbdulAzizBarkat 的帮助,我在模型保存方法中发现了我的错误。

标签: python django django-models


【解决方案1】:

您是否尝试过使用serializers.ModelSerializer

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

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

serializers.py

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

views.py

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
}

注意 - 上面的代码是由 Imagine smart compiler 自动生成的,它允许从一个非常简单的配置中为您的 Django 模型(以及 API)生成干净的代码 + 测试。除此之外,它以正确的方式生成代码来处理 Django 视图中的外键关系。你也可以在这里试一试imagine.ai/demo

【讨论】:

  • 我这里没有使用rest框架。并感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2020-10-23
  • 2014-10-26
  • 1970-01-01
  • 2019-11-30
相关资源
最近更新 更多