Задать вопрос
@sashatre

Как сделать create через апи в DRF?

Здравствуйте. Помогите разобраться в DRF, пытаюсь написать простое апи с интерфейсом для пользователя (html/css)

Мой код view:
class CarCreate(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'cars/newCar.html'
    serializer_class = CarDetailSerializer
    authentications_classes = (TokenAuthentication, )
    permission_classes = (IsAuthenticated, )
    
    def get(self, request):
        return Response( template_name = 'cars/newCar.html',)
     
    def post(self, request, *args, **kwargs):
        queryset = Car.objects.create(user= request.user)
        serializer = CarCreateSerializer(queryset, data=request.data)
        if serializer.is_valid():
            return Response({'serializer': serializer, 'queryset': queryset})
   
        serializer.save()   
        
        return redirect('/api/v1/cars/usercars/')


Мой код serializers:
class CarCreateSerializer(serializers.ModelSerializer):
    user = serializers.HiddenField(default=serializers.CurrentUserDefault())
    class Meta:
        model = Car
        fields = '__all__'

    def create(self, validated_data):
        return Car.objects.create(**validated_data)


Моя модель машинки:
User = get_user_model()

class Car(models.Model):
    vin = models.CharField(verbose_name = 'Вин', db_index = True, max_length = 64)
    color = models.CharField(verbose_name="Цвет", max_length=64)
    brand = models.CharField(verbose_name="Brand", max_length=64)
    
    CAR_TYPES = (
        (1, 'Седан'),
        (2, 'Хэчбек'),
        (3, 'Универсал'),
        (4, 'Купе'),
    )
    car_type = models.IntegerField(verbose_name = 'Car_Type', choices=CAR_TYPES)
    user = models.ForeignKey(User, verbose_name="Пользователь", on_delete=models.SET_NULL, null=True, blank=True)


Возвращает ошибку:
NOT NULL constraint failed: cars_car.car_type
Если во вьюхе указать car_type константой, то объект сохраняется, но остальные поля остаются пустыми, а car_type отображается. Как можно править данный код до рабочего состояния?

З.Ы.
До этого писал сериализер для правок таким образом:
class CarUpdate(serializers.ModelSerializer):
    class Meta:
        model = Car
        fields = ('id', 'color', 'brand', 'car_type', 'vin')
    def update(self, instance, validated_data):
        instance.vin = validated_data.get('vin', instance.vin)
        instance.car_type = validated_data.get('car_type', instance.car_type)
        instance.brand = validated_data.get('brand', instance.brand)
        instance.color = validated_data.get('color', instance.color)
        instance.save()
        return instance

Не знаю нужно ли делать нечто подобное для CarCreateSerializer или достаточно исправить вьюху.

Спасибо.
  • Вопрос задан
  • 1775 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MAGistr_MTM
Учусь программировать
Для простых CRUD действий лучше подойдут ViewSets. Но они не подойдут для учебы, так как почти вся логика написана вместо вас
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы