我一直在尝试在我正在开发的 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'
)
您正在打印 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
的子序列化器。