Как правильно использовать get_or_create в сериализаторе django и избежать ошибки 'уже существует'?

У меня есть следующие модели django, сериализатор и набор представлений.


class Article(AbstractBaseModel):
    manufacturer = models.ForeignKey(
        Manufacturer,
        on_delete=models.CASCADE,
        null=True,
        blank=True
    )

    provider1 = models.ForeignKey(
        Provider,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
    )
    def get_absolute_url(self):

        return reverse(

            "smt_management_app:article-detail", kwargs={"name": self.name}

        )
class Manufacturer(models.Model):

    name = models.CharField(

        primary_key=True, max_length=50, null=False, blank=False

    )


    def get_absolute_url(self):

        return reverse(

            "smt_management_app:manufacturer-detail", kwargs={"name": self.name}

        )


class Provider(models.Model):

    name = models.CharField(

        primary_key=True, max_length=50, null=False, blank=False

    )


    def get_absolute_url(self):

        return reverse("smt_management_app:provider-detail", kwargs={"name": self.name})


class ArticleSerializer(serializers.ModelSerializer):

    manufacturer = ManufacturerSerializer(required=False, allow_null=True)

    provider1 = ProviderSerializer(required=False, allow_null=True)

    class Meta:

        model = Article

        fields = [

            "name",

            "manufacturer",

            "provider1",

        ]


    def create(self, validated_data):

        manufacturer_data = validated_data.pop("manufacturer", None)

        if manufacturer_data:

            manufacturer, _ = Manufacturer.objects.get_or_create(

                name=manufacturer_data["name"]

            )

            validated_data["manufacturer"] = manufacturer


        provider1_data = validated_data.pop("provider1", None)

        if provider1_data:

            provider1, _= Provider.objects.get_or_create(

                name=provider1_data["name"]

            )

            validated_data["provider1"] = provider1


        article = Article.objects.create(**validated_data)

        return article


class ArticleViewSet(viewsets.ModelViewSet):

    queryset = Article.objects.all()

    serializer_class = ArticleSerializer

    filter_backends = (

        django_filters.rest_framework.DjangoFilterBackend,

        filters.SearchFilter,

        filters.OrderingFilter,

    )

    filterset_class = ArticleFilter

    ordering_fields = "__all__"


При размещении новой статьи я сталкиваюсь с неожиданным поведением. Производитель и поставщик в следующем примере оба существуют, но только поставщик вызывает ошибку.

POST body:

{"name":"article1","manufacturer":{"name":"123"},"provider1":{"name":"abc"}}

ERROR body:

{"provider1":{"name":["provider with this name already exists."]}}

Почему

это происходит, если все абсолютно одинаково для производителя и провайдера?
Вернуться на верх