[英]How can I add a car to a user with Django Rest Framework
When i try to add a Car for my user this is what's happening 当我尝试为我的用户添加汽车时,就是这种情况
"username": [
"A user with that username already exists."]
This is my models I'm using Django auth User model There are my models 这是我的模型我正在使用Django auth用户模型有我的模型
class Car(models.Model):
"""
CAR Table with a ForeingKey from USER Table
"""
user = models.ForeignKey(User, related_name='cars')
model = models.CharField(max_length=50)
color = models.CharField(max_length=20)
year = models.IntegerField()
seats = models.IntegerField()
def __unicode__(self):
return u'%d: %s: %s: %d' % (self.id, self.model, self.color, self.year)
My Serializers 我的序列化器
class CarSerializer(serializers.ModelSerializer):
class Meta:
model = Car
fields = (
'model',
'color',
'seats'
)
class AddCarSerializer(serializers.ModelSerializer):
car = CarSerializer()
class Meta:
model = User
fields = (
'username',
'car'
)
this is my View 这是我的看法
class AddCarForUser(APIView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
def put(self, request):
car = AddCarSerializer(data = request.data)
car.is_valid(raise_exception = True)
car.save()
return Response(status=status.HTTP_201_CREATED)
And this is what i'm sending in a Put Request 这就是我发出的看跌期权请求
{
"username": "root",
"car": {
"model": "Seat Ibiza",
"color": "Verde",
"seats": "4"
}}
Your code doesn't works because you use serializer.ModelSerializer
and the username
attribute of the User
class must be unique, that why It can't validate it. 您的代码无效,因为您使用了serializer.ModelSerializer
并且User
类的username
属性必须是唯一的,这就是为什么它无法对其进行验证的原因。 To overcome this, follow these steps. 若要克服此问题,请按照下列步骤。
AddCarSerializer
. 更新您的序列化器AddCarSerializer
。 We add a custom field username
to handle username passed without a unique, just a simple CharField
. 我们添加了一个自定义字段username
来处理传递的username
,而该用户名没有唯一的,只是一个简单的CharField
。 And we add create
function because Nested Serializer can't handle creation or update out the box: 并且我们添加了create
函数,因为嵌套序列化器无法处理创建或更新框: class AddCarSerializer(serializers.Serializer):
# add username custom field
username = serializers.CharField()
car = CarSerializer()
class Meta():
fields = (
'username',
'car'
)
def create(self, validated_data):
""" Add car to an user
"""
tmp_car = validated_data.pop('car')
user = User.objects.get(username=validated_data['username'])
car = Car.objects.create(
user=user,
model=tmp_car['model'],
color=tmp_car['color'],
seats=tmp_car['seats'],
)
return car
class AddCarForUser(APIView):
def put(self, request):
serializer = AddCarSerializer(data = request.data)
if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_201_CREATED)
return Response(status=status.HTTP_400_BAD_REQUEST)
Car
model, because year
attribute doesn't exist when we add a car to an user then, add null=True
: 更新您的Car
模型,因为当我们向用户添加汽车时, year
属性不存在,因此请添加null=True
: class Car(models.Model):
user = models.ForeignKey(User, related_name='cars')
model = models.CharField(max_length=50)
color = models.CharField(max_length=20)
year = models.IntegerField(null=True)
seats = models.IntegerField()
And it should work. 它应该工作。 Don't forget to handle error like if the username passed doesn't exist. 不要忘记处理错误,例如如果传递的用户名不存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.