【问题标题】:Django (DRF) Serializer inserting NULLDjango(DRF)序列化程序插入NULL
【发布时间】:2018-08-30 01:01:43
【问题描述】:

我遇到了一个 Django 问题,我试图在 MySQL 数据库中插入一个新行,但没有为未指定的数据提供 NULL。

例如,考虑以下情况:

class MyModel(models.Model):
    class Meta:
        db_table = 'model_table'
        managed = False

    a = models.AutoField(primary_key=True)
    b = models.CharField(max_length=255)
    c = models.CharField(max_length=255, blank=True)

当向 Serializer 提供以下数据以进行 save() 时:

    data = list()
    data['b'] = 'Some Text'
    serializer = serializers.MyModelSerializer(data=data)
    serializer.save()

生成的 SQL 对于每个未指定的字段(在本例中为“c”)都具有 NULL。数据库中的表不允许 NULL,但有默认值来处理未指定的数据。

是否可以覆盖此序列化程序功能以允许在尝试插入时完全省略字段,或者我是否必须创建一个省略这些字段的新模型并为这种特定情况创建一个“创建”模型对这些领域有了解吗?

注意:序列化程序在其fields 变量中只有字段“b”,因此它无法立即识别“c”列。

编辑:尝试澄清一下,这是生成的 SQL,由于列中不允许空值,该 SQL 失败。然而,'c' 确实有默认值。

INSERT INTO `model_table` (`b`, `c`) VALUES ('Some Text', NULL)

'a' PK 的 AutoField 很好,默认省略,但 'c' 被替换为 NULL,因为在提供给序列化程序的数据中没有提供值,而不是从完全是 SQL。作为一种解决方法,我复制了模型并从中删除了我不需要的字段,只是为了让它工作,并且生成的 SQL 是有效的,因为模型本身不知道列,但这看起来不像最好的方法来做到这一点。以下是我想要这个模型和序列化器组合输出的

INSERT INTO `model_table` (`b`) VALUES ('Some Text')

因此,'c' 提供了 MySQL 本身提供的默认列值。当我没有向序列化程序提供任何数据时,模型和序列化程序试图插入 NULL 是问题。

【问题讨论】:

    标签: python mysql django django-rest-framework


    【解决方案1】:

    您可以重写序列化程序创建方法,如下所示

    class UserSerializer(serializers.ModelSerializer):
        profile = ProfileSerializer()
    
        class Meta:
            model = User
            fields = ('username', 'email', 'profile')
    
        def create(self, validated_data):
            profile_data = validated_data.pop('profile')
            user = User.objects.create(**validated_data)
            Profile.objects.create(user=user, **profile_data)
            return user
    

    【讨论】:

    • 谢谢,但这不是我要问的——我已经很好地省略了数据,它根本没有提供给序列化器。问题是生成的 SQL 会将 NULL 值添加到未提供的任何内容中,从而导致 SQL 失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多