Проверка существования объекта перед сохранением django rest framework

Когда я размещаю новые данные, я хочу проверить создание нового объекта man и объекта dok, связанного с объектами man, но если объект man уже существует, я хочу добавить к нему связанный объект dok. подскажите как начать, я совсем новичок в rest_framework

class Man(ListCreateAPIView):
    queryset =  Man.objects.all()
    serializer_class = ManSerial

model.py


class Man(models.Model):
    name = models.CharField(max_length=50,unique=True)
    age = models.IntegerField()
    def __str__(self):
        return self.name


class Dok(models.Model):
    man = models.ForeignKey(Man,on_delete=models.CASCADE,related_name="dok_man")
    cool =  models.CharField(max_length=400)
    def __str__(self) :
        return str(self.man)

serializer.py

class Dokserial(serializers.ModelSerializer):
    class Meta:
        model = Dok
        fields ='__all__'

class ManSerial(serializers.ModelSerializer):
    data = Dokserial(source="dok_man",many=True)
    class Meta:
        model = Man
        fields = '__all__'
man = Man.objects.get_or_create(name=new_man_name, age=new_man_age)
Dok.objects.create(man=man, cool=new_cool)

Выбирается существующий человек, если он есть (с атрибутами name и age) или создается новый, если нет.

Я не знаю почему или как, но это решило мою проблему: я отредактировал свой класс сериализатора, чтобы

class ManSerial(serializers.ModelSerializer):
    data = Dokserial(source="dok_man",many=True)
    class Meta:
        model = Man
        fields = '__all__'
        extra_kwargs = {
            'name': {'validators': []},
        }

Вы можете попробовать следующий фрагмент, который будет извлекать первую найденную запись, если она существует, затем возвращать ее, или выполнять оригинальное "create".

class FooViewSet(viewsets.ModelViewSet):
    serializer_class = FooSerializer
    queryset = Foo.objects.all()


    def perform_create(self, serializer: Serializer):
        a= serializer.validated_data["a"]
        b= serializer.validated_data["b"]
        # return the exists one
        if qs := self.queryset.filter(a=a, b=b):
            serializer.instance = qs.first()
            return
        super().perform_create(serializer)
Вернуться на верх