Как правильно использовать 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."]}}
Почему
это происходит, если все абсолютно одинаково для производителя и провайдера?