如何在Django Rest Framework中仅通过关联字段ID创建对象?
嘿,我来帮你搞定这个问题!先梳理下代码里的小细节,再给你一套可行的实现方案:
1. 先修正模型里的拼写与字段命名
提两个容易踩坑的小细节:
Resturant拼写错误啦,正确写法是Restaurant- 外键字段名
resturant_id其实没必要加_id,Django会自动在数据库中生成名为resturant_id的列,模型里直接用restaurant更符合Django规范,也不容易混淆
修正后的模型代码:
# models.py from django.db import models from django.utils.translation import gettext_lazy as _ class Restaurant(models.Model): # 修正拼写 name = models.CharField(_('name'), max_length=100) class Menu(models.Model): # 字段名改为restaurant,Django自动处理数据库列名 restaurant = models.OneToOneField(Restaurant, related_name='menu', on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now=True)
2. 配置序列化器支持传入关联ID
你需要在序列化器里把关联字段指定为PrimaryKeyRelatedField,并绑定对应的查询集,这样就能直接接收Restaurant的ID来创建Menu了:
# serializers.py from rest_framework import serializers from .models import Menu, Restaurant class MenuSerializer(serializers.ModelSerializer): # 用PrimaryKeyRelatedField允许传入Restaurant的ID restaurant = serializers.PrimaryKeyRelatedField(queryset=Restaurant.objects.all()) class Meta: model = Menu fields = ['id', 'restaurant', 'created_at']
3. 视图层处理创建请求
如果用DRF的通用视图,直接用CreateAPIView就能搞定,不需要额外写太多逻辑:
# views.py from rest_framework.generics import CreateAPIView from .models import Menu from .serializers import MenuSerializer class MenuCreateView(CreateAPIView): queryset = Menu.objects.all() serializer_class = MenuSerializer
4. 实际请求示例
发送POST请求到你的创建接口,请求体传JSON格式的数据就行,里面只需要填对应Restaurant的ID:
{ "restaurant": 1 # 这里替换成你已存在的Restaurant的ID }
如果你坚持要保留原字段名(不推荐)
要是你不想改模型里的resturant_id字段名,那序列化器得对应调整下,指定source来映射到实际的关联对象:
class MenuSerializer(serializers.ModelSerializer): resturant_id = serializers.PrimaryKeyRelatedField(queryset=Restaurant.objects.all(), source='restaurant') class Meta: model = Menu fields = ['id', 'resturant_id', 'created_at']
不过还是建议遵循Django的命名规范,避免后续维护时搞混~
内容的提问来源于stack exchange,提问作者Mirza715
相关产品推荐
相关产品推荐

