diff --git a/cmdb-api/api/lib/cmdb/ipam/address.py b/cmdb-api/api/lib/cmdb/ipam/address.py
index 6fda8f5..1ebb82b 100644
--- a/cmdb-api/api/lib/cmdb/ipam/address.py
+++ b/cmdb-api/api/lib/cmdb/ipam/address.py
@@ -106,8 +106,8 @@ class IpAddressManager(object):
                     ci_id = ip2ci[ip]['_id']
                     CIManager().update(ci_id, _sync=True, **kwargs)
                     if IPAddressBuiltinAttributes.ASSIGN_STATUS in kwargs and (
-                            kwargs[IPAddressBuiltinAttributes.ASSIGN_STATUS] !=
-                            ip2ci[ip].get(IPAddressBuiltinAttributes.ASSIGN_STATUS)):
+                            (kwargs[IPAddressBuiltinAttributes.ASSIGN_STATUS] or 2) !=
+                            (ip2ci[ip].get(IPAddressBuiltinAttributes.ASSIGN_STATUS) or 2)):
                         status_change_num += 1
                 ci_ids.append(ci_id)
 
diff --git a/cmdb-api/api/lib/cmdb/ipam/subnet.py b/cmdb-api/api/lib/cmdb/ipam/subnet.py
index 3a58aeb..cd40750 100644
--- a/cmdb-api/api/lib/cmdb/ipam/subnet.py
+++ b/cmdb-api/api/lib/cmdb/ipam/subnet.py
@@ -265,9 +265,9 @@ class SubnetManager(object):
 
         return _id
 
-    def delete(self, _id):
-        if CIRelation.get_by(only_query=True).join(CI, CI.id == CIRelation.second_ci_id).filter(
-                CIRelation.first_ci_id == _id).filter(CI.type_id == self.type_id).first():
+    @classmethod
+    def delete(cls, _id):
+        if CIRelation.get_by(only_query=True).filter(CIRelation.first_ci_id == _id).first():
             return abort(400, ErrFormat.ipam_subnet_cannot_delete)
 
         existed = IPAMSubnetScan.get_by(ci_id=_id, first=True, to_dict=False)
diff --git a/cmdb-api/api/lib/mixin.py b/cmdb-api/api/lib/mixin.py
index d2d4abf..ca74a4d 100644
--- a/cmdb-api/api/lib/mixin.py
+++ b/cmdb-api/api/lib/mixin.py
@@ -1,6 +1,7 @@
 # -*- coding:utf-8 -*-
 
 
+from flask import current_app
 from sqlalchemy import func
 
 from api.extensions import db
@@ -32,11 +33,21 @@ class DBMixin(object):
 
         for k in kwargs:
             if hasattr(cls.cls, k):
-                query = query.filter(getattr(cls.cls, k) == kwargs[k])
-                if count_query:
-                    _query = _query.filter(getattr(cls.cls, k) == kwargs[k])
+                if isinstance(kwargs[k], list):
+                    query = query.filter(getattr(cls.cls, k).in_(kwargs[k]))
+                    if count_query:
+                        _query = _query.filter(getattr(cls.cls, k).in_(kwargs[k]))
+                else:
+                    if "*" in str(kwargs[k]):
+                        query = query.filter(getattr(cls.cls, k).ilike(kwargs[k].replace('*', '%')))
+                        if count_query:
+                            _query = _query.filter(getattr(cls.cls, k).ilike(kwargs[k].replace('*', '%')))
+                    else:
+                        query = query.filter(getattr(cls.cls, k) == kwargs[k])
+                        if count_query:
+                            _query = _query.filter(getattr(cls.cls, k) == kwargs[k])
 
-        if reverse:
+        if reverse in current_app.config.get('BOOL_TRUE'):
             query = query.order_by(cls.cls.id.desc())
 
         if only_query and not count_query:
diff --git a/cmdb-api/api/models/cmdb.py b/cmdb-api/api/models/cmdb.py
index 5385dc2..2a9cc63 100644
--- a/cmdb-api/api/models/cmdb.py
+++ b/cmdb-api/api/models/cmdb.py
@@ -476,6 +476,7 @@ class PreferenceShowAttributes(Model):
     uid = db.Column(db.Integer, index=True, nullable=False)
     type_id = db.Column(db.Integer, db.ForeignKey("c_ci_types.id"), nullable=False)
     attr_id = db.Column(db.Integer, db.ForeignKey("c_attributes.id"))
+    builtin_attr = db.Column(db.String(256), nullable=True)
     order = db.Column(db.SmallInteger, default=0)
     is_fixed = db.Column(db.Boolean, default=False)