【问题标题】:Use condition in update_or_create of django (DRF)django (DRF) 的 update_or_create 中的使用条件
【发布时间】:2021-02-16 21:00:08
【问题描述】:

这是我的 API 序列化器:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = [
            'name',
        ]

    def create(self, validated_data):
        from django.db.models import F, Case, When

        instance, created = self.Meta.model.objects.update_or_create(
            merchant=validated_data.pop('merchant'),
            defaults={
                'name': Case(
                    When(is_synchronizable=True, then='test'),
                    default=F('name')
                )
            }
        )
        return instance

我想在 is_synchronizable 为 True 时更新名称。 但我得到这个错误:

django.core.exceptions.FieldError: Cannot resolve keyword 'test' into field.

【问题讨论】:

    标签: django postgresql django-rest-framework django-orm


    【解决方案1】:

    您必须将字段名称输入then=。如果您想输入原始值,请使用Value()

    【讨论】:

    • 当我使用 Value,得到这个错误:AttributeError: 'WhereNode' object has no attribute 'contains_column_references'
    • 嗯,这可能是语法问题,如果你不给我任何东西就很难说。
    【解决方案2】:

    试试这个,看看会发生什么

    class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model = Product
            fields = [
                'name',
            ]
    
        def create(self, validated_data):
            from django.db.models import F, Case, When
    
            instance, created = self.Meta.model.objects.update_or_create(
                merchant=validated_data.pop('merchant'),
                defaults={
                    'name': Case(
                        When(is_synchronizable=True, then=F('name')),
                        default=F('name')
                    )
                }
            )
            return instance
    

    您可以将 F('name') 替换为 F('test') 并尝试一下

    【讨论】:

    • AttributeError: 'WhereNode' 对象没有属性 'contains_column_references'
    • 当我使用 F('test') 时,得到同样的错误。 django.core.exceptions.FieldError:无法将关键字“测试”解析为字段。
    【解决方案3】:

    试试这个

    class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model = Product
            fields = [
                'name',
            ]
    
        def create(self, validated_data):
            from django.db.models import F, Case, When
    
            instance, created = self.Meta.model.objects.update_or_create(
                merchant=validated_data.pop('merchant'),
                defaults={
                    'name': Case(
                        When(is_synchronizable=True, then=Value('test') ),
                        default=F('name')
                    )
                }
            )
            return instance
    

    【讨论】:

    • AttributeError: 'WhereNode' 对象没有属性 'contains_column_references'
    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2017-11-27
    • 2021-05-09
    • 1970-01-01
    • 2015-12-10
    相关资源
    最近更新 更多