Index: django/newforms/models.py
===================================================================
--- django/newforms/models.py	(revision 4872)
+++ django/newforms/models.py	(working copy)
@@ -7,7 +7,7 @@
 from util import ValidationError
 from forms import BaseForm, DeclarativeFieldsMetaclass, SortedDictFromList
 from fields import Field, ChoiceField
-from widgets import Select, SelectMultiple, MultipleHiddenInput
+from widgets import Select, SelectMultiple, MultipleHiddenInput, ModelSelectMultiple
 
 __all__ = ('save_instance', 'form_for_model', 'form_for_instance', 'form_for_fields',
            'ModelChoiceField', 'ModelMultipleChoiceField')
@@ -168,7 +168,7 @@
     "A MultipleChoiceField whose choices are a model QuerySet."
     hidden_widget = MultipleHiddenInput
     def __init__(self, queryset, cache_choices=False, required=True,
-            widget=SelectMultiple, label=None, initial=None, help_text=None):
+            widget=ModelSelectMultiple, label=None, initial=None, help_text=None):
         super(ModelMultipleChoiceField, self).__init__(queryset, None, cache_choices,
             required, widget, label, initial, help_text)
 
Index: django/newforms/widgets.py
===================================================================
--- django/newforms/widgets.py	(revision 4872)
+++ django/newforms/widgets.py	(working copy)
@@ -191,7 +191,7 @@
         if value is None: value = []
         final_attrs = self.build_attrs(attrs, name=name)
         output = [u'<select multiple="multiple"%s>' % flatatt(final_attrs)]
-        str_values = set([smart_unicode(v) for v in value]) # Normalize to strings.
+        str_values = set([self.value_to_str(v) for v in value]) # Normalize to strings.
         for option_value, option_label in chain(self.choices, choices):
             option_value = smart_unicode(option_value)
             selected_html = (option_value in str_values) and ' selected="selected"' or ''
@@ -204,6 +204,13 @@
             return data.getlist(name)
         return data.get(name, None)
 
+    def value_to_str(cls, value):
+        return smart_unicode(value)
+
+def ModelSelectMultiple(forms.SelectMultiple):
+    def value_to_str(cls, value):
+        return super(ModelSelectMultiple, cls).value_to_str(value._get_pk_val())
+
 class RadioInput(StrAndUnicode):
     "An object used by RadioFieldRenderer that represents a single <input type='radio'>."
     def __init__(self, name, value, attrs, choice, index):
