| 167 | | |
|---|
| 168 | | def _get_pk_val(self, meta=None): |
|---|
| 169 | | if not meta: |
|---|
| 170 | | meta = self._meta |
|---|
| 171 | | return getattr(self, meta.pk.attname) |
|---|
| 172 | | |
|---|
| 173 | | def _set_pk_val(self, value): |
|---|
| 174 | | return setattr(self, self._meta.pk.attname, value) |
|---|
| 175 | | |
|---|
| 176 | | pk = property(_get_pk_val, _set_pk_val) |
|---|
| 177 | | |
|---|
| 178 | | def __repr__(self): |
|---|
| 179 | | return smart_str(u'<%s: %s>' % (self.__class__.__name__, unicode(self))) |
|---|
| 180 | | |
|---|
| 181 | | def __str__(self): |
|---|
| 182 | | if hasattr(self, '__unicode__'): |
|---|
| 183 | | return force_unicode(self).encode('utf-8') |
|---|
| 184 | | return '%s object' % self.__class__.__name__ |
|---|
| 185 | | |
|---|
| 186 | | def __eq__(self, other): |
|---|
| 187 | | return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val() |
|---|
| 188 | | |
|---|
| 189 | | def __ne__(self, other): |
|---|
| 190 | | return not self.__eq__(other) |
|---|
| 191 | | |
|---|
| 192 | | def __hash__(self): |
|---|
| 193 | | return hash(self._get_pk_val()) |
|---|
| | 240 | def from_sequence(cls, values): |
|---|
| | 241 | """ |
|---|
| | 242 | An alternate class constructor, primarily for internal use. |
|---|
| | 243 | |
|---|
| | 244 | Creates a model instance from a sequence of values (which corresponds |
|---|
| | 245 | to all the non-many-to-many fields in creation order. If there are more |
|---|
| | 246 | fields than values, the remaining (final) fields are given their |
|---|
| | 247 | default values. |
|---|
| | 248 | |
|---|
| | 249 | ForeignKey fields can only be initialised using id values, not |
|---|
| | 250 | instances, in this method. |
|---|
| | 251 | """ |
|---|
| | 252 | dispatcher.send(signal=signals.pre_init, sender=cls, args=values, |
|---|
| | 253 | kwargs={}) |
|---|
| | 254 | obj = Empty() |
|---|
| | 255 | obj.__class__ = cls |
|---|
| | 256 | field_iter = iter(obj._meta.fields) |
|---|
| | 257 | for val, field in izip(values, field_iter): |
|---|
| | 258 | setattr(obj, field.attname, val) |
|---|
| | 259 | for field in field_iter: |
|---|
| | 260 | setattr(obj, field.attname, field.get_default()) |
|---|
| | 261 | dispatcher.send(signal=signals.post_init, sender=cls, instance=obj) |
|---|
| | 262 | return obj |
|---|
| | 263 | |
|---|
| | 264 | from_sequence = classmethod(from_sequence) |
|---|
| | 265 | |
|---|
| | 266 | def __repr__(self): |
|---|
| | 267 | return smart_str(u'<%s: %s>' % (self.__class__.__name__, unicode(self))) |
|---|
| | 268 | |
|---|
| | 269 | def __str__(self): |
|---|
| | 270 | if hasattr(self, '__unicode__'): |
|---|
| | 271 | return force_unicode(self).encode('utf-8') |
|---|
| | 272 | return '%s object' % self.__class__.__name__ |
|---|
| | 273 | |
|---|
| | 274 | def __eq__(self, other): |
|---|
| | 275 | return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val() |
|---|
| | 276 | |
|---|
| | 277 | def __ne__(self, other): |
|---|
| | 278 | return not self.__eq__(other) |
|---|
| | 279 | |
|---|
| | 280 | def __hash__(self): |
|---|
| | 281 | return hash(self._get_pk_val()) |
|---|
| | 282 | |
|---|
| | 283 | def _get_pk_val(self, meta=None): |
|---|
| | 284 | if not meta: |
|---|
| | 285 | meta = self._meta |
|---|
| | 286 | return getattr(self, meta.pk.attname) |
|---|
| | 287 | |
|---|
| | 288 | def _set_pk_val(self, value): |
|---|
| | 289 | return setattr(self, self._meta.pk.attname, value) |
|---|
| | 290 | |
|---|
| | 291 | pk = property(_get_pk_val, _set_pk_val) |
|---|
| | 292 | |
|---|