首页 > 解决方案 > 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”中传递的参数。如何做到这一点?

标签: djangodjango-rest-framework

解决方案


推荐阅读