On Sep 14, 7:19 pm, Artur Ergashev <the...@gmail.com> wrote:
> I'm working on some models for a legacy database structure, and am
> having a road_block with Foreign Keys and non-conventional names.
>
> As I understand it, if in my model I have something like:
>
> something = ForeignKey(something)
>
> then django will look for the something_id field in my table when
> looking for the relationship. However, if my table has
> anotherthing_id, I would have to explicitly define that name. The
> documentation has me believe that I would do:
>
> something = ForeignKey(something, to_field='anotherthing_id')
>
> however it doesn't seem to work this well, Django (particularly the
> admin) appears to want to find something_id. Here's the concrete case
> in my code:
>
> # site table
> # site_id (PK)
> # ...
>
> # core.Site
> class Site(models.Model):
>     id = models.IntegerField(primary_key=True, db_column='site_id')
>
> # member.User
> class User(models.Model):
>     #I already have a attribute in this model called site, so I can't
> just do site = ... as it wouldn't be descriptive enough even if I
> wouldn't have a conflict
>     last_login_site_id = models.ForeignKey('core.Site',
> to_field='site_id', related_name='site_last_login_users')
>
> The error I get:
>
> Caught an exception while rendering: (1054, "Unknown column
> 'user.last_login_site_id_id' in 'field list'")
>
> However when I change the User model to:
>
> class User(models.Model):
>     #I already have a attribute in this model called site, so I can't
> just do site = ... and it isn't descriptive anyway...
>     last_login_site_id = models.ForeignKey('core.Site',
> db_column='site_id', related_name='site_last_login_users')
>
> everything seems to work fine. This is confusing to me since I thought
> to_field was the attribute I needed, and db_column isn't documented as
> a keyword argument for ForeignKey (I assume it's inherited somehow or
> undocumented).
>
> Am I doing something horribly wrong? Or did I just misunderstand the
> model docs?
>
> Thanks!

Yes, you've misunderstood. to_field is the column in the related table
which your foreignkey is pointing to. So, for example, if your Site
table had a column site_name, and you wanted the value of your FK to
be taken from that field rather than the primary key for some reason,
you would set to_field to 'site_name'. It doesn't change the name of
the underlying field in the current model.

db_column is documented under the list of attributes which are common
to all fields, here:
http://docs.djangoproject.com/en/dev/ref/models/fields/#common-model-field-options
--
DR.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to