Создать объект со связью один ко многим через API
Я создаю объект таблицы TypesSafetyBreaches который имеет связь ForeignKey с таблицей ListOfSafetyBreachesNames. Если ни в первой, ни во второй таблице нету записываемого значения, тогда с помощью метода create я создаю оба объекта и связываю их. Но если таблица ListOfSafetyBreachesNames уже имеет значение name_safety_breaches, я бы хотел создать объект таблицы TypesSafetyBreaches и связать его с уже существующим. Метод же описанный ниже в данном случае вызовет Bad Request: /api/private_safety_breaches/
Я пробовал использовать метод get_or_create, но это почему-то не помогло.
models.py
class TypesSafetyBreaches(models.Model):
id_types_safety_breaches = models.AutoField(primary_key=True,)
safety_breaches = models.ForeignKey(ListOfSafetyBreachesNames, on_delete=models.DO_NOTHING, blank=True, null=True, related_name='filial_safety_breaches_ListOfSafetyBreachesNames')
id_filial = models.ForeignKey('Filial', models.DO_NOTHING, blank=True, null=True, related_name='TypesSafetyBreaches_Filial')
common = models.BooleanField()
is_delete = models.BooleanField(default=False)
class ListOfSafetyBreachesNames(models.Model):
id_name_safety_breaches = models.AutoField(primary_key=True,)
name_safety_breaches = models.CharField(max_length=256, unique=True)
serialize.py
class TypesSafetyBreachesSerializer(ModelSerializer):
safety_breaches = ListOfSafetyBreachesNamesSerializer()
class Meta:
model = TypesSafetyBreaches
fields = ['id_types_safety_breaches', 'safety_breaches', 'id_filial', 'common', 'is_delete']
def create(self, validated_data):
print('here ------------')
safety_breaches_data = validated_data.pop('safety_breaches')
name = ListOfSafetyBreachesNames.objects.get_or_create(**safety_breaches_data)
obj = TypesSafetyBreaches.objects.create(safety_breaches=name, **validated_data)
return obj
api_views.py
class PrivateSafetyBreachesViewSet(ModelViewSet):
serializer_class = TypesSafetyBreachesSerializer
model = TypesSafetyBreaches
permission_classes = [IsAuthenticated]
filter_backends = [DjangoFilterBackend]
filterset_fields = ['safety_breaches__name_safety_breaches', 'is_delete', 'id_filial']
def get_queryset(self, *args, **kwargs):
specialist_filial = self.request.user.profile.is_specialist_in_filial
if specialist_filial:
id_filial = self.request.user.profile.id_filial.id_filial
qs = self.model.objects.filter(common=False, id_filial__id_filial=id_filial)
else:
qs = None
return qs