Проверка существования объекта перед сохранением 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)