Wednesday, December 1, 2010

Re: get_object_or_404 on composite key and Value Error:Invalid Literal for int with base 10

On 1 déc, 19:20, Pranav <pranav...@gmail.com> wrote:
> Hi all,
>
> I'm new to django and python and i'm working on a project that works
> with a legacy database.
> I've a particular problem with a "composite key" and "get" or
> "get_object_or_404".
>
> i generated the below model form the legacy database using inspectdb
>
> model:
> ------------------
> class Member:

This should inherit from models.Model

>            member_id = field.CharField(max_length=20)
>            organization_id = field.Foreignkey(Organization)
>            member_type = field.CharField(max_length=10)
>            class Meta:
>                     db_table = u'member'
>                     unique_together =
> (('member_id','organization_id'),)
> # unique_together is a constraint i added in order to form the
> composite primary key

It's a composite key, but it's not a primary key - or at least it's
not recognized as such by Django (hint: Django doesn't handle
composite primary keys so far)

> class Organization:

idem

>
> I have a function in my view which receives a "MemOrgId" which is
> nothing but the composite key of both member_id and organization_id.
> for example the value i get is MemOrgId='AA1001', now the problem is
> when i try to use get or a get_object_or_404 i get a Value
> Error:Invalid Literal for int with base 10.
>
> obj = get_object_or_404(Member,pk = MemOrgId)


Since you didn't explicitly declared a primary key for your Member
model, Django automagically adds one, named "id" and defined as an
autoincrement integer, so the 'pk' shortcut resolves to this int
field.

> According to my understanding of the trace back its not able to
> convert the key "CP1001" to int coz it contains char data along with
> int. I cannot modify the database

Should not be a major problem.

> and i cannot change the way MemOrgId
> comes to the view function.

Why ?

> Is there a way around this problem????

Yes: split the compound key and do an explicit lookup:


def yourview(request, MemOrgId):
oid, mid = MemOrgId[0:2], MemOrgId[2:]
obj = get_object_or_404(
organization_id=oid,
member_id=mid
)


IRL you probably want a bit more validation on what the MemOrgId arg
looks like - but this can be done with the correct regexp in your
urls.py

--
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+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment