Python 如何使用Django Rest框架向用户添加汽车
当我尝试为我的用户添加一辆车时,就是这样Python 如何使用Django Rest框架向用户添加汽车,python,django,django-models,django-views,django-rest-framework,Python,Django,Django Models,Django Views,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') mod
"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)
这就是我发送的Put请求
{
"username": "root",
"car": {
"model": "Seat Ibiza",
"color": "Verde",
"seats": "4"
}}
您的代码无法工作,因为您使用了
serializer.ModelSerializer
,并且User
类的username
属性必须是唯一的,这就是它无法验证它的原因。要克服这个问题,请遵循以下步骤
AddCarSerializer
。我们添加了一个自定义字段username
,以处理传递的用户名,而不使用唯一的,只是一个简单的CharField
。我们添加了create
函数,因为嵌套序列化程序无法处理创建或即时更新:class AddCarSerializer(serializers.Serializer):
#添加用户名自定义字段
username=serializers.CharField()
car=CarSerializer()
类Meta():
字段=(
“用户名”,
“汽车”
)
def创建(自我验证的_数据):
“”“将汽车添加到用户”
"""
tmp\u car=已验证的\u数据.pop('car')
user=user.objects.get(username=validated_数据['username'])
car=car.objects.create(
用户=用户,
型号=tmp_车[‘型号’],
颜色=tmp_车['color'],
座椅=tmp_车[‘座椅’],
)
回程车
class AddCarForUser(APIView):
def put(自我,请求):
serializer=AddCarSerializer(data=request.data)
如果序列化程序.u有效():
serializer.save()
返回响应(状态=status.HTTP\u 201\u已创建)
返回响应(status=status.HTTP\u 400\u BAD\u请求)
汽车
型号,因为当我们向用户添加汽车时,年份
属性不存在,请添加null=True
:等级车(型号.型号):
user=models.ForeignKey(用户,相关的\u name='cars')
model=models.CharField(最大长度=50)
颜色=型号.CharField(最大长度=20)
年份=型号。整型字段(空=真)
seats=models.IntegerField()
它应该会起作用。不要忘记处理错误,就像传递的用户名不存在一样。用户名不需要在
car
元素中吗?Luis它工作了,并且汽车是在数据库中创建的,但是我在/login/addcar/get AttributeError处收到此错误AttributeError,在尝试获取字段username
在序列化程序上AddCarSerializer
。序列化程序字段的名称可能不正确,并且与Car
实例上的任何属性或键都不匹配。最初的异常文本是:“Car”对象没有“username”属性。我检查了您的代码,它在我的计算机上工作。尝试临时注释authentication\u classes=(TokenAuthentication,)permission\u classes=(IsAuthenticated,)
如果将汽车添加到用户,这是另一个问题。您在使用位数据时出现此错误?为什么url是/login/addcar
?我看到url(r'^addcar/',views.AddCarForUser.as_view()),
,那么为什么以前有/login/
?您是否在AddCarForUser
视图中添加了一些内容?您能来聊天吗?