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
    视图中添加了一些内容?您能来聊天吗?