Django DRF外键序列化
我无法使用Foreignkey字段保存模型 多亏了“阿祖多”问题的解决。下面的解决方案 例如,我有一些简单的模型: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
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)