Django DRF外键序列化

Django DRF外键序列化,django,django-rest-framework,Django,Django Rest Framework,我无法使用Foreignkey字段保存模型 多亏了“阿祖多”问题的解决。下面的解决方案 例如,我有一些简单的模型: class User(AbstractUser): class Meta: pass email_validator = EmailValidator() username = models.CharField('Name', max_length=150, ) id = models.UUIDField(primary_key=T

我无法使用Foreignkey字段保存模型

多亏了“阿祖多”问题的解决。下面的解决方案

例如,我有一些简单的模型:

class User(AbstractUser):
    class Meta:
        pass

    email_validator = EmailValidator()
    username = models.CharField('Name', max_length=150, )
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = models.EmailField('Email', blank=True, unique=True, validators=[email_validator], )
    ...

class Package(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='packages')
    description = models.CharField('Description', max_length=256, default='description')
    weight = models.CharField('weight', max_length=256, default='weight')
    ...
视图(保证用户在请求中):

我的序列化程序:

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'


class PackageSerializer(ModelSerializer):

    class Meta:
        model = Package
        fields = (
            'user', 'description', 'weight', 'dimensions', 'estimated_shipping_cost', 'deliver_to_date')

    def to_representation(self, instance):
        self.fields['user'] = UserSerializer(many=False, read_only=True)
        self.fields['where_from'] = LocationSerializer(many=False, read_only=True)
        self.fields['destination'] = LocationSerializer(many=False, read_only=True)
        return super().to_representation(instance)

    def create(self, validated_data):
        user = User.objects.get(validated_data.pop('user'))
        package = Package.objects.create(user=user, **validated_data)
        return package
请求中的json:

@api_view(["POST"])
def test(request):
    data = request.data
    data['user'] = User.objects.get(id=request.user.id)
    serializer = PackageSerializer(data=data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data)
    else:
        return JsonResponse(serializer.errors)

{
    "description": "Some package",
    "weight": "12",
}
所以,我在数据库中有一个用户,我想为他创建一个包。但是在
PackageSerializer
中重写的
create
中,
验证的\u数据
没有
用户
。请解释我做错了什么

django和drf的版本:

django==2.2.4
djangorestframework==3.10.2   
解决方案:

序列化程序:

class PackageSerializer(ModelSerializer):
    user = UserSerializer(many=False, read_only=True)

    class Meta:
        model = Package
        fields = (
            'user', 'description', 'weight', 'dimensions', 'estimated_shipping_cost', 'deliver_to_date')

    def create(self, validated_data):
        user = User.objects.get(validated_data.pop('user'))
        package = Package.objects.create(user=user)
        return package
视图:

@api_view(["POST"])
def create_package(request):
    data = request.data
    serializer = PackageSerializer(data=data)
    if serializer.is_valid():
        serializer.save(user=request.user)
        return JsonResponse(serializer.data)
    else:
        return JsonResponse(serializer.errors)

DRF将忽略标记为只读的包含字段,以便调用者不能包含只读数据。如果要包含其他属性,只需将其作为关键字args传递以保存:

e、 g

@api_view(["POST"])
def test(request):
    data = request.data
    serializer = PackageSerializer(data=data)
    if serializer.is_valid():
        serializer.save(user=request.user)
        return JsonResponse(serializer.data)
    else:
        return JsonResponse(serializer.errors)