You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Rest Framework创建带外键产品:无分类选择框问题

问题解决步骤

1. 修复视图中的导入拼写错误

你的views.py中导入序列化器时存在拼写错误(serilaizers → serializers),这会导致视图无法正常加载序列化器,是字段不显示的潜在原因:

修改views.py中的导入行:

from .serializers import ProductSerializer, CategorySerializer  # 修正拼写错误

2. 修复Product模型中的price字段错误

PositiveSmallIntegerField是整数类型字段,不能设置空字符串作为默认值,否则会触发数据库错误:

修改models.py中的Product类:

class Product(models.Model):
    name = models.CharField(max_length=200, unique=True)
    price = models.PositiveSmallIntegerField(default=0)  # 将默认值改为整数0
    category = models.ForeignKey(Category, on_delete=models.CASCADE, blank=True, default=None)

    # ... 其余代码不变

3. 让Category字段显示为可选择控件(单选)

如果需求是单个Product关联单个Category(保持ForeignKey),需要修改ProductSerializer,显式指定category字段为关联字段,让DRF可浏览API显示下拉选择框:

方案A:按ID选择Category

from rest_framework import serializers
from .models import Product, Category

class ProductSerializer(serializers.ModelSerializer):
    category = serializers.PrimaryKeyRelatedField(
        queryset=Category.objects.all(),
        required=False,
        allow_null=True  # 对应模型中的default=None和blank=True
    )

    class Meta:
        model = Product
        fields = '__all__'

方案B:按名称选择Category

如果想在下拉框中显示Category的名称而非ID,使用SlugRelatedField:

class ProductSerializer(serializers.ModelSerializer):
    category = serializers.SlugRelatedField(
        slug_field='name',
        queryset=Category.objects.all(),
        required=False,
        allow_null=True
    )

    class Meta:
        model = Product
        fields = '__all__'

4. 如果需要多选Category(修改为多对多关联)

如果真实需求是单个Product关联多个Category,需要先修改模型字段为ManyToManyField,再配置序列化器:

修改models.py

class Product(models.Model):
    name = models.CharField(max_length=200, unique=True)
    price = models.PositiveSmallIntegerField(default=0)
    category = models.ManyToManyField(Category, blank=True)  # 替换ForeignKey为ManyToManyField

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('name',)

修改serializers.py

class ProductSerializer(serializers.ModelSerializer):
    category = serializers.PrimaryKeyRelatedField(
        queryset=Category.objects.all(),
        many=True,  # 必须设置many=True对应多对多关系
        required=False
    )

    class Meta:
        model = Product
        fields = '__all__'

完成以上修改后,重启服务器,DRF的可浏览API中就会显示Category的选择控件(单选下拉或多选复选框/下拉)。

内容的提问来源于stack exchange,提问作者Maciej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:57:33