产品实施的关键功能

问题描述 投票:0回答:1

我一直在尝试在我正在开发的 django 电子商务项目上实现一项新功能。我在 models.py 文件中为关键功能创建了一个单独的模型,并使用 Manytomanyfield 方法将该模型链接到产品模型。问题是我根本无法输出数据。当我尝试打印它时,即使填充了该字段,它也只输出 None 。 有没有更好更干净的方法来实现这个功能??

我在下面提供了代码位

views.py 文件

class ProductDetail(APIView):
    def get_object(self, category_slug, product_slug):
        try:
            return Product.objects.filter(category__slug=category_slug).get(slug=product_slug)
        except Product.DoesNotExist:
            raise Http404
        
    def get(self, request, category_slug, product_slug, format=None):
        product = self.get_object(category_slug, product_slug)
        feature = product.key_features
        features_serializer = KeyFeatureSerializer(feature)
        serializer = ProductSerializer(product)
        print(feature)
        return Response(serializer.data)

models.py 文件

class KeyFeature(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self) -> str:
        return self.name


class Product(models.Model):
    category = models.ForeignKey(Category, related_name = 'products', on_delete = models.CASCADE)
    name = models.CharField(max_length = 255)
    slug = models.SlugField()
    description = models.TextField(blank=True, null=True)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    image = models.ImageField(upload_to='uploads/', blank=True, null=True)
    thumbnail = models.ImageField(upload_to='uploads/', blank=True, null=True)
    date_added = models.DateTimeField(auto_now_add=True)
    key_features = models.ManyToManyField(KeyFeature, related_name='products')
    


    class Meta:
        ordering = ('-date_added',)

    def __str__(self) -> str:
        return self.name

序列化器.py 文件

from rest_framework import serializers
from .models import *

# a serializer allows python data to be converted to json form

class KeyFeatureSerializer(serializers.ModelSerializer):
    class Meta:
        model = KeyFeature
        fields = ('id', 'name',) 
class ProductSerializer(serializers.ModelSerializer):
    key_features = KeyFeatureSerializer(many=True, read_only=True)
    class Meta:
        model = Product
        fields = (
            'id',
            'name',
            'get_absolute_url',
            'description',
            'price',
            'get_image',
            'get_thumbnail',
            'key_features'
        )

django-models django-rest-framework django-views
1个回答
0
投票

您正在打印 manager 而不是

QuerySet
,因此是
None
,您可以使用以下方式打印:

from django.shortcuts import get_object_or_404


class ProductDetail(APIView):
    def get_object(self):
        return get_object_or_404(
            Product,
            category__slug=self.kwargs['category_slug'],
            slug=self.kwargs['product_slug'],
        )

    def get(self, request, category_slug, product_slug, format=None):
        product = self.get_object()
        feature = product.key_features.all()
        features_serializer = KeyFeatureSerializer(feature, many=True)
        serializer = ProductSerializer(product)
        print(feature)
        return Response(serializer.data)

调用

KeyFeatureSerializer
本身也没有多大意义,因为它是
ProductSerializer
的子序列化器。

© www.soinside.com 2019 - 2024. All rights reserved.