Django, создание действия над моделью с полем m2m, связанным с моделью с пользовательским закрытым ключом

У меня есть эти две модели:

class Vehicle(models.Model):
    """Vehicle object."""
    plate = models.CharField(max_length=255, primary_key=True)
    brand = models.CharField(max_length=255)
    model = models.CharField(max_length=255)
    owner = models.CharField(max_length=255)
    user = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE,
    )

class Center(models.Model):
    """Center object."""
    user = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE,
    )
    name = models.CharField(max_length=255)
    vehicles = models.ManyToManyField('Vehicle', related_name='vehicle_plate')

В моем модульном тесте, если я делаю:

   def test_create_center_with_existing_vehicles(self):
        """Test creating a center with existing vehicle."""

        vehicle_1 = Vehicle.objects.create(user=self.user, plate='ab123cd', brand='brand', model='model', owner='bla bla')

        payload = {
                'name': 'first center',
                'vehicles': [{'plate': 'ab123cd', 'brand': 'brand', 'model': 'model', 'owner': 'bla bla'}]
        }

        res = self.client.post(CENTERS_URL, payload, format='json')

Я получаю ошибку:

{'vehicles': [{'plate': [ErrorDetail(string='vehicle with this plate already exists.', code='unique')]}, {}]}

Я не могу перехватить поток в моем CenterView, perform_create() не интерпритируется ни сериализатором.
Есть ли шаг валидации? Могу ли я переопределить их, например, метод 'get_or_create()'?

Танкс, я начинающий...

Способ перехвата шага проверки, путем переопределения.

Проблема в том, что в моей модели есть уникальное ограничение, поэтому шаг валидации блокируется (он пытается сохранить автомобиль, который существует).

Я не смог переопределить валидацию, поэтому я работал над view.py, переопределяя метод create:

def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data)

    # **start pre-validation* #
    initial_data_vehicles = serializer.initial_data.get('vehicles', [])
    if len(initial_data_vehicles) > 0:
        serializer.initial_data['vehicles'] = []
    existing_vehicles = []
    for vehicle in initial_data_vehicles:
        exists = Vehicle.objects.filter(user=self.request.user,plate=vehicle['plate']).exists()
        if exists:
            existing_vehicles.append(vehicle)
        else:
            serializer.initial_data['vehicles'].append(vehicle)
    # **end* #

    serializer.is_valid(raise_exception=True)
    ###
    # Step 1.
    ###
    center = self.perform_create(serializer)
    ###
    # Step 2.
    ###
    for vehicle in existing_vehicles:
        vehicle_obj, created = Vehicle.objects.get_or_create(user=self.request.user, **vehicle)
        center.vehicles.add(vehicle_obj)

    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
Вернуться на верх