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)