﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
527	OneToOne relations are broken since new model style released	mordaha	Adrian Holovaty	"{{{
#================================================================================
# Document
#================================================================================
class Document(meta.Model):
    #MAIN FIELDS
    doc_date = meta.DateField('date')
    doc_subj = meta.CharField('subj', maxlength=250)
    doc_text = meta.TextField('text', maxlength=250, blank=True)
#================================================================================
#  Letter
#================================================================================
class Letter(meta.Model):
    #IS LETTER
    document = meta.OneToOneField(Document)
    doc_number = meta.CharField('doc number', maxlength=20)
    # from and to ForeignKeys were skipped

#================================================================================
#  Order
#================================================================================
class Order(meta.Model):
    #IS ORDER
    letter = meta.OneToOneField(Letter)
    order_date_plan = meta.DateField('order date plan')
    order_date_fakt = meta.DateField('order date fakt', blank=True, null=True)
}}}

Document can be simple or Letter, and Document that is Letter can be an Order or not.
This example works fine with old model syntax.
With a new-style model syntax any relations between Letter - Order are fail.

Document - Letter relation works fine.

{{{
>>> from django.models.main import *
>>> d = documents.get_object(pk=21)
>>> l = letters.get_object(pk=21)
>>> o = orders.get_object(pk=21)
>>> d.get_letter()
Letter 21
>>> l.get_document()
Document 21
}}}

OK
Now try Letter - Order

{{{
>>> l.get_order()
Traceback (most recent call last):
  File ""<stdin>"", line 1, in ?
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\utils\functi
onal.py"", line 3, in _curried
    return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.item
s()))
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\core\meta\__
init__.py"", line 931, in method_get_related
    kwargs['%s__%s__exact' % (rel_field.name, rel_field.rel.to.pk.name)] = getat
tr(self, rel_field.rel.field_name)
AttributeError: 'Letter' object has no attribute 'document'
>>>
>>>
>>>
>>> o.get_letter()                                                              
Traceback (most recent call last):
  File ""<stdin>"", line 1, in ?
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\utils\functi
onal.py"", line 3, in _curried
    return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.item
s()))
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\core\meta\__
init__.py"", line 873, in method_get_many_to_one
    retrieved_obj = mod.get_object(**{'%s__exact' % field_with_rel.rel.field_nam
e: val})
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\utils\functi
onal.py"", line 3, in _curried
    return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.item
s()))
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\core\meta\__
init__.py"", line 1083, in function_get_object
    obj_list = function_get_list(opts, klass, **kwargs)
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\core\meta\__
init__.py"", line 1123, in function_get_list
    return list(function_get_iterator(opts, klass, **kwargs))
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\core\meta\__
init__.py"", line 1105, in function_get_iterator
    select, sql, params = function_get_sql_clause(opts, **kwargs)
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\core\meta\__
init__.py"", line 1302, in function_get_sql_clause
    tables2, join_where2, where2, params2, _ = _parse_lookup(kwargs.items(), opt
s)
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\core\meta\__
init__.py"", line 1231, in _parse_lookup
    _throw_bad_kwarg_error(kwarg)
  File ""C:\Python24\Lib\site-packages\django-1.0.0-py2.4.egg\django\core\meta\__
init__.py"", line 1181, in _throw_bad_kwarg_error
    raise TypeError, ""got unexpected keyword argument '%s'"" % kwarg
TypeError: got unexpected keyword argument 'document__exact'
>>>
>>>
}}}

"	defect	closed	Metasystem		critical	fixed			Unreviewed	0	0	0	0	0	0
