django-rest-framework Перекрывающая функция создания не работает в ModelSerializer - PullRequest
0 голосов
/ 04 октября 2019

Я хочу вставить только новые данные в свою базу данных. В случае, если данные с тем же первичным ключом уже находятся в базе данных, я хочу игнорировать их и не вызывать исключения. Тем не менее, функция создания по умолчанию 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'

, и я вызываю метод сохранения экземпляра seralizer с помощьюthis:

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 () также ничего не печатают. Итак, я предполагаю, что переопределенный метод вообще не работает. Что я делаю не так или как можно решить эту проблему? Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Сообщение об ошибке, которое вы получаете, является результатом проверки сериализатора, которая выполняется перед вызовом создания.

Вы не можете вызвать serializer.save() без вызова is_valid (вы получите сообщение об ошибке типа: You must call .is_valid() before calling .save()).

Итак, ваш фрагмент кода не завершен.

В вашей модели у вас есть первичный ключ в поле ggl_plc_id, поэтому, когда вы отправляете запрос на создание такого объекта,он проверяет значение поля и, поскольку он является первичным ключом, он должен быть уникальным.

Если я правильно понял, вы хотите вставить новую запись, если она еще не существует.

Я бы предложилчтобы справиться с этим в представлении. Это означает, что вы проверяете, существует ли такая запись, если да, вы используете сериализатор для сериализации существующей записи, в противном случае вы используете ее для создания записи.

0 голосов
/ 04 октября 2019

Я думаю, проблема в том, что вы проверяете, является ли набор запросов None.

if place_map is not None:
    print("USRMAP NOT NONE")
    return place_map

Так что в этом place_map = UsrPlaceMap.objects.filter(ggl_plc_id=place_id) у вас есть переменная place_map, которая является queryset. Вы можете проверить, как определить, что queryset вернул некоторые данные или нет здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...