![](/img/trans.png)
[英]How can I authenticate a user who belongs to another database through my other microservice in django rest framework?
[英]How can I add a car to a user with Django Rest Framework
当我尝试为我的用户添加汽车时,就是这种情况
"username": [
"A user with that username already exists."]
这是我的模型我正在使用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)
我的序列化器
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'
)
这是我的看法
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)
这就是我发出的看跌期权请求
{
"username": "root",
"car": {
"model": "Seat Ibiza",
"color": "Verde",
"seats": "4"
}}
您的代码无效,因为您使用了serializer.ModelSerializer
并且User
类的username
属性必须是唯一的,这就是为什么它无法对其进行验证的原因。 若要克服此问题,请按照下列步骤。
AddCarSerializer
。 我们添加了一个自定义字段username
来处理传递的username
,而该用户名没有唯一的,只是一个简单的CharField
。 并且我们添加了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
模型,因为当我们向用户添加汽车时, 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()
它应该工作。 不要忘记处理错误,例如如果传递的用户名不存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.