【发布时间】:2020-02-02 21:41:52
【问题描述】:
我只想将新数据插入到我的数据库中。如果具有相同主键的数据已经在数据库中,我想忽略它而不引发异常。但是,如果表中已经存在该值,则默认 ModelSerializer 的创建函数似乎会引发异常。所以,我试图通过覆盖 ModelSerializer 的 create() 函数来解决这个问题。
这是我的代码:
序列化器.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'
我正在使用这个调用序列化程序实例的保存方法:
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() 上的打印语句也不打印任何内容。所以,我猜测被覆盖的方法根本没有运行。我做错了什么或者解决这个问题的正确方法是什么?谢谢。
【问题讨论】:
-
您可能正在尝试创建一个与现有
ggl_place_id上相同内容的UsrPlaceMap。发生这种情况是因为您在该字段上有primary_key=True。解决方案不是覆盖序列化程序上的create方法,而是在可能的情况下删除primary_key=True。 -
您可能希望使用
logging来帮助您调试与print。 Here 是文档
标签: django python-3.x django-rest-framework