Я хочу вставить в свою базу данных только новые данные. В случае, если данные с тем же первичным ключом уже находятся в базе данных, я хочу проигнорировать их и не вызывать исключение. Однако функция создания по умолчанию ModelSerializer, похоже, вызывает исключение, если значение уже существует в таблице. Итак, я пытаюсь решить эту проблему, переопределив функцию create () ModelSerializer.
Вот мой код:
serializers.py
class UsrPlaceMapSerializer(serializers.ModelSerializer):
class Meta:
model = UsrPlaceMap
fields = '__all__'
def create(self, validated_data):
place_id = validated_data.get("ggl_plc_id")
place_map = UsrPlaceMap.objects.filter(ggl_plc_id=place_id)
print("USRMAP INIT")
if place_map is not None:
print("USRMAP NOT NONE")
return place_map
place_map = UsrPlaceMap.objects.create(ggl_plc_id=place_id, state=validated_data.get("state"),
cty_nm=validated_data.get("cty_nm"), cntry=validated_data.get("cntry"))
print("USRMAP CREATED")
return place_map
models.py
class UsrPlaceMap(models.Model):
cty_nm = models.CharField(max_length=500)
state = models.CharField(max_length=200, blank=True, null=True)
cntry = models.CharField(max_length=500)
ggl_plc_id = models.CharField(primary_key=True, max_length=500)
class Meta:
managed = False
db_table = 'usr_place_map'
и я вызываю метод save экземпляра seralizer, используя это:
instance = UsrPlaceMapSerializer(data=data, many=True)
if instance.is_valid():
instance.save()
Значения сохраняются, если я отправляю новые значения. Однако я получаю сообщение об ошибке, если пытаюсь отправить значения, уже содержащиеся в таблице:
{
"ggl_plc_id": [
"usr place map with this ggl plc id already exists."
]
}
}
Операторы печати в замещающем create () тоже ничего не печатают. Итак, я предполагаю, что переопределенный метод вообще не работает. Что я делаю не так или как лучше всего решить эту проблему? Спасибо.
UsrPlaceMap
с тем же содержимым наggl_place_id
существующем. Это происходит потому, что в этом поле указаноprimary_key=True
. Решением было бы не переопределить методcreate
в сериализаторе, а вместо этого отказаться отprimary_key=True
, если это возможно. - person Higor Rossato   schedule 04.10.2019logging
для отладки противprint
. Вот документация - person Codebender   schedule 04.10.2019