如何为我的Viewset'创建'并且'更新'方法

时间:2017-07-27 03:09:07

标签: django django-rest-framework

创建新客户端后,我需要他们发回“确认_domain_url'这样我就可以检查它是否等于' domain_url'。我在create方法中调用serializer.is_valid(),它按预期工作。当客户端更新时,它无法说明' domain_url'不见了。我知道我可以为更新方法创建一个新的序列化程序,但我想尽可能多地合并代码。

串行器:

    db.beginTransaction();
    db.execSQL(createTempTable);
    db.execSQL(insertTempTable);
    db.execSQL(dropTable);
    db.execSQL(createTable);
    db.execSQL(insertTable);
    db.execSQL(dropTempTable);
    db.setTransactionSuccessful();
    db.endTransaction();

视图集:

class ClientSerializer(ModelSerializer):
    confirm_domain_url = CharField(write_only=True)
    class Meta:
        model = Client
        fields = [
            'name',
            'schema_name',
            'domain_url',
            'created_on',
            'id',
            # Write only fields (won't be returned in the response):
            'confirm_domain_url',
        ]

    def validate(self, data):
        # Check that domain urls match:
        if data['domain_url'] != data['confirm_domain_url']:
            raise ValidationError('Domain urls do not match.')
        return data

    def create(self, validated_data):
        client = Client(
            name = validated_data['name'],
            schema_name = validated_data['schema_name'],
            domain_url = validated_data['domain_url'],
        )
        client.save()

        return client

1 个答案:

答案 0 :(得分:2)

我们可以在ClientSerializer.validate方法中添加一项检查,检查instance属性是否已分配给序列化程序。如果已在序列化程序上定义了实例,那么它将是更新操作,否则它将没有要更新的实例。因此,这只会在创建时针对domain_url检查confirm_domain_url

class ClientSerializer(ModelSerializer):
    ...

    def validate(self, data):
        # Check that domain urls match:
        if self.instance is None and data['domain_url'] != data['confirm_domain_url']:
            raise ValidationError('Domain urls do not match.')
        return data

    ...

edit - 我在validate方法中更改了if语句的逻辑顺序。问题是它试图在条件的第一部分访问data['domain_url'],导致KeyError。现在它首先检查self.instance is None,这将使if语句短路,并且如果定义了实例,它将不会尝试访问data['domain_url']