django 数据库 get_or_create函数update_or_create函数

1、返回值是tuple的问题

返回的是tuple:(对象, 是否是创建的)

2、如果查询到就返回,如果没查询到就向数据库加入新的对象。

e.g.

size = Size.objects.get_or_create(sizeName=size_text)

3、model 修改数据库数据,数据存在则更新,不存在则保存

update_or_create 用法:
update_or_create(defaults=None, **kwargs)
kwargs: 来更新对象或创建一个新的对象。
defaults: 是由 (field, value) 对组成的字典,用于更新对象。
返回一个由 (object, created)组成的元组,
object: 是一个创建的或者是被更新的对象,
created: 是一个标示是否创建了新的对象的布尔值。
update_or_create: 方法通过给出的kwarg

4、关于django中的get_or_create方法的坑

最近在项目中发现了这样的一个坑,那就是我们的需求是不能添加一个相同的对象到数据库中,就通过某些字段的值组合成唯一值到数据库中去查找数据,如果没有找到对象,那就创建一条新的数据库记录,而刚好django又提供了这种方法,那就是get_or_create。可是在测试的时候发现会加入相同的对象。
而解决方法就是:其实我们可以从数据库级别来使这几个字段组合唯一,这样如果有重复的数据就会加不进去。

class Meta: unique_together = ((“xxx”, “xxxx”),)
先到数据库中找,找不到就创建。
但是为什么使用get_or_create方法就会可能失败呢?
因为get_or_create并不是线程安全的,在多线程得情况下,可能会创建相同数据的字段。

5、Serializer数据反序列化到对象中时出现键约束错误

问题描述
当我尝试将一些数据反序列化到对象中时,如果我包含一个唯一的字段并为其提供已经分配给数据库中对象的值,则会出现键约束错误。这是有道理的,因为它正在尝试创建具有已使用的唯一值的对象。

是否有一种方法可以为get_or_create类型的功能ModelSerializer?我希望能够给序列化器一些数据,如果存在的对象具有给定的唯一字段,则只需返回该对象。

推荐答案
解决方案无法在DRF 3+中使用,因为 serializer.is_valid()正确地遵守了模型的unique_together约束。您可以通过删除 UniqueTogetherValidator 并覆盖序列化程序的 create 方法来解决此问题

from rest_framework import validators
class MyModelSerializer(serializers.ModelSerializer):

    def run_validators(self, value):
        for validator in self.validators:
            if isinstance(validator, validators.UniqueTogetherValidator):
                self.validators.remove(validator)
        super(MyModelSerializer, self).run_validators(value)

    def create(self, validated_data):
        instance, _ = models.MyModel.objects.get_or_create(**validated_data)
        return instance

    class Meta:
        model = models.MyModel

相比于Serializer类序列化器,DRF还提供了一个更加深度封装的ModelSerializer模型类序列化器,可以帮助我们更快的、傻瓜式的创建一个Serializer类。

ModelSerializer与常规的Serializer相同,但提供了:

基于模型类自动生成一系列字段(可以不再自己定义字段)
基于模型类自动为Serializer生成validators,比如unique_together()
包含默认的create()和update()的实现(可以不再自己定义update和create方法)

django 数据库 get_or_create函数update_or_create函数

6、modelsSerializer get数据

    book_list = models.BOOKS.objects.all()
    # 序列化过程,把queryset转换成字典
    # 第一个参数是需要序列化的对象,如果序列化多条数据,一定要加上many=True
    ser = BookSerializer(instance=book_list,many=True)  # 可使用关键字传参
    # ser = BookSerializer(book_list,many=True)  # 可使用位置传参
    # 将数据返回(此时数据是字典形式,返回到前端则是json格式数据,这是Response帮我们完成的,serializer序列化是将queryset对象转换为字典的形式。)
    return Response(ser.data)

Original: https://blog.csdn.net/kunwen123/article/details/126171059
Author: kunwen123
Title: django 数据库 get_or_create函数update_or_create函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/735686/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球