django - HyperlinkedModelSerializer 可写相关字段
问题描述
楷模:
class User(AbstractUser):
ROLE_CHOICES = (
('R', 'rider'),
('D', 'driver'),
)
role = models.CharField(max_length=1, choices=ROLE_CHOICES)
phone_number = models.CharField(max_length=10)
cab = models.OneToOneField('Cab', on_delete=models.CASCADE, blank=True, null=True)
class Cab(models.Model):
color = models.CharField(max_length=20)
rn = models.CharField(max_length=20)
available = models.BooleanField(default=True)
model = models.CharField(max_length=50)
驱动序列化器:
class DriverSerializer(serializers.HyperlinkedModelSerializer):
cab = serializers.HyperlinkedIdentityField(view_name='cab_detail')
class Meta:
model = User
fields = ('id', 'username', 'email', 'phone_number', 'cab', 'password')
extra_kwargs = {
'password': {'write_only': True},
'cab': {'required':True}
}
#depth = 1
def create(self, validated_data):
password = validated_data.pop('password')
instance = User(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
driver_list 视图
@api_view(['GET', 'POST'])
def driver_list(request):
if request.method == 'GET':
riders = User.objects.filter(role='D')
serializer_context = {
'request': request,
}
serializer = DriverSerializer(riders, context = serializer_context, many=True)
return Response(serializer.data)
elif request.method == 'POST':
#context = {'role':'D'}
#serializer = DriverSerializer(data=request.data, context=context)
serializer_context = {
'request': request,
}
serializer = DriverSerializer(data=request.data, context = serializer_context)
if serializer.is_valid(raise_exception=True):
serializer.save(role='D')
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
这会在 GET 驱动程序/
cab 字段指向与用户对象 id 相同 id 的 cab 对象
[
{
"id": 2,
"username": "aditi",
"email": "aditi@gmail.com",
"phone_number": "8130022156",
"cab": "http://127.0.0.1:8000/api/cabs/2"
},
{
"id": 7,
"username": "test3",
"email": "himanshu@gmail.com",
"phone_number": "9976544776",
"cab": "http://127.0.0.1:8000/api/cabs/7"
},
我希望 cab 字段在创建用户对象时指向“cab”中传递的参数。如何做到这一点?
解决方案
推荐阅读
- docker - 在 helm install 之前将 go 二进制文件移动到 pod 的惯用方法是什么?
- vue.js - 两行 vuetify v-switch 标签
- apache - 无法通过 IP 限制对 SSL 上的 Apache 2.4 反向代理的访问
- oracle - 根据另一个表的总计数动态创建表
- python-3.x - 如何检查列中的值变化
- machine-learning - 机器学习模型是否可能具有低测试误差和高训练误差?
- c# - 如何将用户设置保存到文本文件,然后让应用程序设置文件读取和使用它们
- ubuntu - 安装 curl 后出现致命错误:调用未定义函数 curl_init()
- javascript - 使用 Puppeteer 时在下拉菜单中找不到可用的选择器?
- maven - 无法在 sts 中创建 maven webapp 项目