两个字段的组合在Python E中是唯一的

2024-04-25 06:11:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在pythoneve框架中,是否可以有一个条件来检查两个字段的组合是否唯一?在

例如,下面的定义仅限制名字姓氏对于资源中的项目是唯一的。在

people = {
    # 'title' tag used in item links.
    'item_title': 'person',
    'schema': {
        'firstname': {
            'type': 'string',
            'required': True,
            'unique': True
        },
        'lastname': {
            'type': 'string',
            'required': True,
            'unique': True
        }
}

相反,有没有办法限制名字姓氏组合的唯一性?在

或者,有没有办法为此实现一个CustomValidator?在


Tags: 框架truestring定义titletyperequired资源
2条回答

通过重载_validate_unique并在那里实现自定义逻辑,利用self.document来检索其他字段值,您可能可以达到您想要的效果。在

但是,由于对每个唯一字段都调用了_validate_unique,因此最终将执行两次自定义验证,一次是针对firstname,然后是针对lastname。不太合意。当然,最好的办法是设置fullname字段,但我想这不是您的选择。在

你考虑过换个稍微不同的设计吗?比如:

{'name': {'first': 'John', 'last': 'Doe'}}

然后,您只需确保name是必需的唯一:

^{pr2}$

灵感来自尼古拉和_validate_unique。在

from eve.io.mongo import Validator
from eve.utils import config
from flask import current_app as app

class ExtendedValidator(Validator):
    def _validate_unique_combination(self, unique_combination, field, value):
        """ {'type': 'list'} """
        self._is_combination_unique(unique_combination, field, value, {})


    def _is_combination_unique(self, unique_combination, field, value, query):
        """ Test if the value combination is unique.
        """
        if unique_combination:
            query = {k: self.document[k] for k in unique_combination}
            query[field] = value

            resource_config = config.DOMAIN[self.resource]

            # exclude soft deleted documents if applicable
            if resource_config['soft_delete']:
                query[config.DELETED] = {'$ne': True}

            if self.document_id:
                id_field = resource_config['id_field']
                query[id_field] = {'$ne': self.document_id}

            datasource, _, _, _ = app.data.datasource(self.resource)

            if app.data.driver.db[datasource].find_one(query):
                key_names = ', '.join([k for k in query])
                self._error(field, "value combination of '%s' is not unique" % key_names)

相关问题 更多 >