Django: Обработка дублированных значений в уникальных строках

У меня есть строка данных, и в ней находится объект Protein. Белковый объект имеет уникальный protein_id (не PK) и ряды данных могут иметь повторяющиеся белковые объекты.

Так, когда пользователь создает строку данных, скажем Data: {'protein_id':ABC123}, если данный protein_id уже существует в базе данных, мы будем использовать этот объект белка.

Я могу создать объект белка, когда он не существует в базе данных. Но когда он уже существует, я получаю "белок с таким идентификатором белка уже существует.".

Я понимаю, что это происходит потому, что я создаю новый объект белка с тем же самым protein_id и protein_id имеет атрибут unique=True. Но я не понимаю, почему я не могу получить объект, если он существует, или почему возникает исключение (не уверен в логике).

Models.py

class Protein(models.Model):
    protein_id = models.CharField(max_length=256, null=False, blank=False,unique=True)
    sequence = models.CharField(max_length=40000,blank=True)

Serializer.py

class ProteinSerializer(serializers.ModelSerializer):
    class Meta:
        model = Protein
        fields = ['protein_id',"sequence"]
    def create(self,validated_data):
        protein_data = validated_data.pop('protein')
        protein = None
        try:
            protein = Protein.objects.get(protein_id=protein_data['protein_id'])
        except Protein.DoesNotExist:
            protein = Protein.objects.create(**protein_data)
        return protein

Здесь я попробовал метод try-except, в котором сериализатор сначала получит объект белка в базе данных и, если он не может быть найден, выбросит исключение, которое затем создаст объект белка. Я также попробовал get_or_create() и думаю, что логика одинаковая для этих двух методов.

Так что я не уверен, почему я все еще создаю объект (выбрасывая исключение), когда он может быть найден. Или у меня неправильный подход? Заранее спасибо!

Вернуться на верх