django - 使用 postgresql 在 django hstorefield 中存储唯一值

标签 django postgresql

是否可以将 postgresql hstorefield (django >= 1.8) 添加到 hstore 中的值是唯一的模型? 键显然是唯一的,但值也可以是唯一的吗?我想可以将自定义验证器添加到模型中,但我很想知道这是否可以在数据库级别完成

最佳答案

单个 hstore 值可以包含多个 key => value 对,使得基于唯一索引的解决方案变得不可能。此外,您的新 hstore 值也可以有多个 key => value 对。唯一可行的替代方案是表上的 BEFORE INSERT OR UPDATE 触发器:

CREATE FUNCTION trf_uniq_hstore_values() RETURNS trigger AS $$
DECLARE
  dups text;
BEGIN
  SELECT string_agg(x, ',') INTO dups
  FROM (SELECT svals(hstorefield) AS x FROM my_table) sub
  JOIN (SELECT svals(NEW.hstorefield) AS x) vals USING (x);

  IF dups IS NOT NULL THEN
    RAISE NOTICE format('Value(s) %s violate(s) uniqueness constraint. Operation aborted.', dups);
    RETURN NULL;
  ELSE
    RETURN NEW;
  END IF;
END; $$ LANGUAGE plpgsql;

CREATE TRIGGER tr_uniq_hstore_values
BEFORE INSERT OR UPDATE ON my_table
FOR EACH ROW EXECUTE PROCEDURE trf_uniq_hstore_values();

请注意,这不会捕获表中现有的重复项。

关于django - 使用 postgresql 在 django hstorefield 中存储唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32626489/

相关文章:

python - Python mixin 是否可以访问全局变量?

postgresql - Doctrine2 : YEAR, PostgreSQL 的 MONTH、DAY 或 DATE_FORMAT

python - 使用 Django 在 Html 表中交替行颜色

ruby - 在 postgres heroku 中创建表

postgresql - PGPoolingDataSource 不接受默认的自动提交

arrays - 如何在 PostgreSql 中克隆数组?

node.js - 如何从 Nest.js 连接到 Heroku Postgres?

python - Django Rest Framework : Access primary key of field in serializer. is_valid -> 序列化器.错误

python - 如何使用 xml 标签将 Element 打印为正确的 xml?

django - 如何在测试 Django 时禁用 csrf?