diff --git a/trac/ticket/model.py b/trac/ticket/model.py
--- a/trac/ticket/model.py
+++ b/trac/ticket/model.py
@@ -52,6 +52,10 @@
             tkt_id = int(tkt_id)
         self.resource = Resource('ticket', tkt_id, version)
         self.fields = TicketSystem(self.env).get_ticket_fields()
+        self.std_fields = [f['name'] for f in self.fields
+                               if not f.get('custom')]
+        self.custom_fields = [f['name'] for f in self.fields
+                              if f.get('custom')]
         self.time_fields = [f['name'] for f in self.fields
                             if f['type'] == 'time']
         self.values = {}
@@ -95,18 +99,16 @@
             db = self._get_db(db)
 
             # Fetch the standard ticket fields
-            std_fields = [f['name'] for f in self.fields
-                          if not f.get('custom')]
             cursor = db.cursor()
             cursor.execute("SELECT %s FROM ticket WHERE id=%%s"
-                           % ','.join(std_fields), (tkt_id,))
+                           % ','.join(self.std_fields), (tkt_id,))
             row = cursor.fetchone()
         if not row:
             raise ResourceNotFound(_('Ticket %(id)s does not exist.', 
                                      id=tkt_id), _('Invalid ticket number'))
 
         self.id = tkt_id
-        for i, field in enumerate(std_fields):
+        for i, field in enumerate(self.std_fields):
             value = row[i]
             if field in self.time_fields:
                 self.values[field] = from_utimestamp(value)
@@ -116,11 +118,10 @@
                 self.values[field] = value
 
         # Fetch custom fields if available
-        custom_fields = [f['name'] for f in self.fields if f.get('custom')]
         cursor.execute("SELECT name,value FROM ticket_custom WHERE ticket=%s",
                        (tkt_id,))
         for name, value in cursor:
-            if name in custom_fields:
+            if name in self.custom_fields:
                 if value is None:
                     self.values[name] = empty
                 else:
@@ -200,31 +201,21 @@
                 values[field] = to_utimestamp(values[field])
         
         # Insert ticket record
-        std_fields = []
-        custom_fields = []
-        for f in self.fields:
-            fname = f['name']
-            if fname in self.values:
-                if f.get('custom'):
-                    custom_fields.append(fname)
-                else:
-                    std_fields.append(fname)
-
         tkt_id = [None]
         @self.env.with_transaction(db)
         def do_insert(db):
             cursor = db.cursor()
             cursor.execute("INSERT INTO ticket (%s) VALUES (%s)"
-                           % (','.join(std_fields),
-                              ','.join(['%s'] * len(std_fields))),
-                           [values[name] for name in std_fields])
+                           % (','.join(self.std_fields),
+                              ','.join(['%s'] * len(self.std_fields))),
+                           [values[name] for name in self.std_fields])
             tkt_id[0] = db.get_last_id(cursor, 'ticket')
 
             # Insert custom fields
-            if custom_fields:
+            if self.custom_fields:
                 cursor.executemany("""
                 INSERT INTO ticket_custom (ticket,name,value) VALUES (%s,%s,%s)
-                """, [(tkt_id[0], name, self[name]) for name in custom_fields])
+                """, [(tkt_id[0], name, self[name]) for name in self.custom_fields])
 
         self.id = tkt_id[0]
         self.resource = self.resource(id=tkt_id[0])
@@ -306,10 +297,8 @@
                 comment_num = str(num + 1)
 
             # store fields
-            custom_fields = [f['name'] for f in self.fields if f.get('custom')]
-
             for name in self._old.keys():
-                if name in custom_fields:
+                if name in self.custom_fields:
                     cursor.execute("""
                         SELECT * FROM ticket_custom 
                         WHERE ticket=%s and name=%s
@@ -441,9 +430,6 @@
                 return
             ts = row[0]
             
-            custom_fields = set(f['name'] for f in self.fields
-                                if f.get('custom'))
-
             # Find modified fields and their previous value
             cursor.execute("""
                 SELECT field, oldvalue, newvalue FROM ticket_change
@@ -469,7 +455,7 @@
                     break
                 else:
                     # No next change, edit ticket field
-                    if field in custom_fields:
+                    if field in self.custom_fields:
                         cursor.execute("""
                             UPDATE ticket_custom SET value=%s
                             WHERE ticket=%s AND name=%s

