简体   繁体   English

如何使用Django Rest Framework向用户添加汽车

[英]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. 若要克服此问题,请按照下列步骤。

  1. Update your serializer 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
  1. update your view : 更新您的看法:
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. update your 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.

相关问题 如何通过 django rest 框架中的其他微服务对属于另一个数据库的用户进行身份验证? - How can I authenticate a user who belongs to another database through my other microservice in django rest framework? 如何向 django-rest-framework 的 ModelSerializer 添加额外的属性? - How can I add an extra property to django-rest-framework's ModelSerializer? 如何使用 django rest 框架添加每个学生的多个图像 - how can I add multiple images of each student using django rest framework (Django Rest Framework) 如何更新用户模型 - (Django Rest Framework) How Do I Update The User Model Django REST Framework:如何将FK设置为​​可选? - Django REST Framework: How can I set a FK as optional? 如何在Django Rest Framework中用id替换对象? - How can I replace an object by its id in Django Rest Framework? 如何在Django-rest-framework中序列化列表? - how can I serializer a list in django-rest-framework? 如何使用 Django Rest Framework 清除图像? - How can I clear an image with Django Rest Framework? 如何使用Django Rest Framework返回HttpResponse? - How can I return an HttpResponse with Django Rest Framework? 在Django Rest Framework中,如何使用TemplateHTMLRenderer查看分页数据? - In Django Rest Framework, how can I view paginated data with TemplateHTMLRenderer?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM