繁体   English   中英

如何使用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属性必须是唯一的,这就是为什么它无法对其进行验证的原因。 若要克服此问题,请按照下列步骤。

  1. 更新您的序列化器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
  1. 更新您的看法:
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)
  1. 更新您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM