#13343: Wrong behavior of ManyToMany relationship while using 'trough' in
ManyToManyField and 'db_column' and 'to_field' properties in intermediate
model
------------------------------------------+---------------------------------
Reporter: twil | Owner: nobody
Status: new | Milestone: 1.2
Component: Database layer (models, ORM) | Version: 1.2-beta
Keywords: | Stage: Unreviewed
Has_patch: 0 |
------------------------------------------+---------------------------------
= Models =
{{{
#!python
# coding: utf-8
from django.db import models
class NagiosHosts(models.Model):
class Meta:
db_table = 'nagios_hosts'
managed = False
host_id = models.IntegerField(primary_key = True)
host_object_id = models.IntegerField()
alias = models.CharField(max_length = 255)
display_name = models.CharField(max_length = 255)
address = models.CharField(max_length = 128)
class NagiosHostStatus(models.Model):
class Meta:
db_table = 'nagios_hoststatus'
managed = False
hoststatus_id = models.IntegerField(primary_key = True)
host_object_id = models.IntegerField()
hosts = models.ForeignKey('NagiosHosts', db_column = 'host_object_id',
to_field = 'host_object_id')
last_check = models.DateTimeField()
current_state = models.IntegerField()
output = models.CharField(max_length = 255)
class NagiosHostGroups(models.Model):
class Meta:
db_table = 'nagios_hostgroups'
managed = False
hostgroup_id = models.IntegerField(primary_key = True)
hostgroup_object_id = models.IntegerField()
alias = models.CharField(max_length = 255)
members = models.ManyToManyField('NagiosHosts', through =
'NagiosHostGroupMembers')
class NagiosHostGroupMembers(models.Model):
class Meta:
db_table = 'nagios_hostgroup_members'
managed = False
hostgroup_member_id = models.IntegerField(primary_key = True)
hostgroup_id = models.IntegerField()
host_object_id = models.IntegerField()
group = models.ForeignKey('NagiosHostGroups', db_column =
'hostgroup_id', to_field = 'hostgroup_id')
host = models.ForeignKey('NagiosHosts', db_column = 'host_object_id',
to_field = 'host_object_id')
}}}
= Wrong Behavior (a.k.a Querying DB) =
{{{
#!text
Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from djnag.ndo2dj.models import *
>>> from django.db import connection
>>> g1 = NagiosHostGroups.objects.all()[0]
>>> print g1.alias
Switches
>>> g1.members.all()
[]
>>> connection.queries
[{'time': '0.001', 'sql': u'SELECT `nagios_hosts`.`host_id`,
`nagios_hosts`.`host_object_id`, `nagios_hosts`.`alias`,
`nagios_hosts`.`display_name`, `nagios_hosts`.`address` FROM
`nagios_hosts` INNER JOIN `nagios_hostgroup_members` ON
(`nagios_hosts`.`host_id` = `nagios_hostgroup_members`.`host_object_id`)
WHERE `nagios_hostgroup_members`.`hostgroup_id` = 53 LIMIT 21'}]
}}}
== Resulting (Wrong!!!) SQL query ==
{{{
#!sql
SELECT `nagios_hosts`.`host_id`, `nagios_hosts`.`host_object_id`,
`nagios_hosts`.`alias`, `nagios_hosts`.`display_name`,
`nagios_hosts`.`address`
FROM `nagios_hosts`
INNER JOIN `nagios_hostgroup_members` ON (`nagios_hosts`.`host_id` =
`nagios_hostgroup_members`.`host_object_id`)
WHERE `nagios_hostgroup_members`.`hostgroup_id` = 53
LIMIT 21
}}}
Here Django relies on primary key of NagiosHosts
(nagios_hosts.'''host_id''' = nagios_hostgroup_members.host_object_id)
rather than on to_field = '''host_object_id''' set in intermediate model.
And I think this behavior is wrong. It should use to_field setting.
--
Ticket URL: <http://code.djangoproject.com/ticket/13343>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.